mvc 3 Ajax.ActionLink с изображением не работает

Я использую vs2010 win7 x64 MVC 3 с обычным сервером разработки asp.net. И новейшие версии firefox, IE9 и chrome.

У меня есть строго типизированное представление, и я пытаюсь заставить метод расширения ajax работать через слегка измененную версию этого кода asp-net-mvc-ajax-actionlink-with-image, который Арьян Эйнбу предоставил для mvc 3.

Вот мой код метода расширения, расположенный в файле Helper.cs в папке App_Code моего веб-сайта mvc.

public static class HelperExtensions
{
    public static IHtmlString ImageActionLink(this AjaxHelper helper, string imageUrl, string titleText, string actionName, object routeValues, AjaxOptions ajaxOptions)
    {
        var builder = new TagBuilder("img");
        builder.MergeAttribute("src", imageUrl);
        builder.MergeAttribute("title", titleText);
        var link = helper.ActionLink("[replaceme]", actionName, routeValues, ajaxOptions).ToHtmlString();
        return new MvcHtmlString(link.Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing)));
    }
}

На мой взгляд, у меня есть @model IEnumerable<Models.SpeciesType> вверху, определяющее модель, и я использую...

        @Ajax.ImageActionLink(Url.Content("~/Content/ThumbUp.png"), "Valid/Appropriate", "VoteUp", new {id = item.ID}, new AjaxOptions { HttpMethod = "POST" } ); 

чтобы вставить ссылку действия ajax с изображением, чтобы пользователь мог проголосовать за элемент. Приведенный выше код не работает, и независимо от того, что я делаю, он продолжает выдавать ошибку за бесконечной ошибкой. Текущая ошибка, которую он мне дает, это...

Сообщение об ошибке компилятора: CS0121: вызов неоднозначен между следующими методами или свойствами: «HelperExtensions.ImageActionLink (System.Web.Mvc.AjaxHelper, строка, строка, строка, объект, System.Web.Mvc.Ajax.AjaxOptions)» и 'HelperExtensions.ImageActionLink (System.Web.Mvc.AjaxHelper, строка, строка, строка, объект, System.Web.Mvc.Ajax.AjaxOptions)'

Это означает, что у меня есть два метода с одинаковым именем и сигнатурой в одном и том же пространстве имен, которые конфликтуют, что опять же невозможно, потому что я определил его только один раз в одном файле кода. Поэтому я подумал, что у меня может быть проблема с кэшированием, поэтому я нажал ctrl+shift+delete в firefox и полностью очистил кеш, историю и все остальное. Обновил страницу и получаю ту же ошибку. Я также тестировал его в IE9 и Chrome с той же проблемой.

Я остановил и запустил сервер разработки asp.net, вышел из Visual Studio и перезапустил ту же проблему.

Сделал очистку диска, все проверил и запустил. Очистка диска не удалила все файлы в «C:\Users\Dean\AppData\Local\Temp», поэтому я вручную удалил все оставшиеся файлы в папке, которые мог, включая папку «Временные файлы ASP.NET». Затем я снова запустил vs2010 и запустил веб-сайт. Опять все та же ошибка «CS0121: вызов неоднозначен между следующими методами... и т. д. и т. д.»

Я не могу избавиться от этой ошибки, что бы я ни делал. Это была не единственная ошибка, которую я получал. До того, как эта ошибка начала сохраняться, я также получал ошибки, связанные с тем, что mvc не смог найти метод ImageActionLink с правильной подписью, а именно

ImageActionLink(this AjaxHelper<IEnumerable<SpeciesType>> helper, etc etc

эта ошибка, как я предполагаю, была связана с тем, что я использую строго типизированное представление.

Поэтому, чтобы попытаться избавиться от ошибки «вызов неоднозначен», я закомментировал весь метод ImageActionLink, перекомпилировал и снова запустил веб-сайт. я получил эту ошибку

Сообщение об ошибке компилятора: CS1061: «System.Web.Mvc.AjaxHelper>» не содержит определения для «ImageActionLink», и метод расширения «ImageActionLink», принимающий первый аргумент типа «System.Web.Mvc.AjaxHelper>», не может быть найдено (вам не хватает директивы using или ссылки на сборку?)

Эта ошибка имеет смысл, потому что ImageActionLink больше не существует. Итак, следующее, что я сделал, это раскомментировал метод ImageActionLink, перекомпилировал и снова запустил веб-сайт. И, конечно же, та же самая ошибка «вызов неоднозначен».

Я в растерянности. Я сделал все, что мог придумать, чтобы очистить различные кэши, чтобы исключить это, прокомментировать и раскомментировать фрагменты кода и проверить, какая часть ломается. Но я застрял, не имея возможности передать ошибку «неоднозначный вызов».

У кого-нибудь есть идеи, как исправить эту ошибку «вызов неоднозначен», чтобы я мог спросить, почему я не могу заставить работать простой метод расширения ajax?


Я избавился от ошибки "неоднозначный вызов". Что произошло, так это то, что я скопировал версию кода mvc 3 Арьяна Эйнбу, найденную здесь asp-net -mvc-ajax-actionlink-with-image.

Затем я создал новый класс в Visual Studio в папке App_Code и сделал ctrl+a ctrl+v и заменил весь предварительно сгенерированный код шаблона класса только классом HelperExtensions. Проблема заключалась в том, что я не обернул HelperExtensions пространством имен, соответствующим пространству имен веб-сайта.

Что-то в том, как asp.net компилирует файлы кода без пространств имен, все испортило. Я предполагаю, что это, вероятно, потому, что код компилируется в dll основного веб-сайта во время сборки, а затем, когда asp.net запускается, он компилирует любые файлы кода, которые он находит в папке app_code, таким образом, два класса с тем же именем и тем же именем метода или некоторые такой.

Во всяком случае, теперь, когда я решил это обострение, я запускаю свой веб-сайт и получаю следующую ошибку ...

Compiler Error Message: CS1061: 'System.Web.Mvc.AjaxHelper<IEnumerable<Models.SpeciesType>>' does not contain a definition for 'ImageActionLink' and no extension method 'ImageActionLink' accepting a first argument of type 'System.Web.Mvc.AjaxHelper<IEnumerable<Models.SpeciesType>>' could be found (are you missing a using directive or an assembly reference?)

Ошибка читается так, как будто она находит метод ImageActionLink, но первый параметр метода ImageActionLink не имеет типа AjaxHelper<IEnumerable<Models.SpeciesType>>

Ошибка не совсем понятна. Да, первый параметр метода ImageActionLink имеет тип AjaxHelper, но не общий тип AjaxHelper. Поэтому я попытался изменить объявление метода ImageActionLink следующим образом.

  public static IHtmlString ImageActionLink(this AjaxHelper<IEnumerable<SpeciesType>> helper, string imageUrl, string titleText, string actionName, object routeValues, AjaxOptions ajaxOptions)

Но я все еще получаю ту же ошибку. Первый параметр в ImageActionLink имеет тип AjaxHelper, но он определен как «этот помощник AjaxHelper», что означает, что это метод расширения, который должен расширять класс AjaxHelper.

Мне действительно не нужен @model IEnumerable<Models.SpeciesType> в верхней части моего файла index.cshtml, поэтому я удалил его и попытался снова запустить приложение с той же ошибкой, только на этот раз

Compiler Error Message: CS1061: 'System.Web.Mvc.AjaxHelper<dynamic>' does not contain a definition for 'ImageActionLink' and no extension method 'ImageActionLink' accepting a first argument of type 'System.Web.Mvc.AjaxHelper<dynamic>' could be found (are you missing a using directive or an assembly reference?)

Кто-нибудь знает, почему я получаю эту ошибку? И как это исправить?


person Dean Lunz    schedule 07.06.2011    source источник


Ответы (1)


Где в Web.config вы добавили пространство имен (вы используете бритвенные представления)? На страницы или на

<system.web.webPages.razor>
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="toolbox" />
        <add namespace="aa.App_Code"/>
      </namespaces>
    </pages>
</system.web.webPages.razor>

попробуйте добавить сюда, измените вид (добавьте тег) и проверьте, работает ли он.

person MorioBoncz    schedule 07.06.2011