mvc 3 Ajax.ActionLink с изображением не работает - PullRequest
0 голосов
/ 08 июня 2011

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

У меня строго типизированное представление, и я пытаюсь заставить метод расширения ajax работать через слегка измененную версию этого кода asp-net-mvc-ajax-actionlink-with-image , который Арджан Einbu предоставил для 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: The вызов неоднозначен между следующие методы или свойства: «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», поэтому я вручную удалил все оставшиеся файлы в папке, которые я мог, включая папку «Temporary ASP.NET Files». Затем я снова запустил vs2010 и запустил сайт. Снова все та же ошибка "CS0121: вызов неоднозначен между следующими методами ... и т. Д. И т. П."

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

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

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

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

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

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

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

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


Я избавился от ошибки «вызов неоднозначен». Произошло то, что я скопировал версию кода Arjan Einbu 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, таким образом, два класса с одинаковым именем и одинаковым именем метода или некоторые например. * 1 050 *

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

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?)

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

1 Ответ

0 голосов
/ 08 июня 2011

Где в 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>

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

...