Представление MVC не может найти мой метод расширения

Я создал метод расширения:

namespace MyComp.Web.MVC.Html
{
    public static class LinkExtensions
    {
        public static MvcHtmlString ActionImageLink(this HtmlHelper htmlHelper, string linkText, string imageSource, string actionName)
        {
            ...
        }
    }
}

Я сослался на сборку из моего приложения mvc и попытался импортировать пространство имен в своем представлении:

<%@ Import Namespace="MyComp.Web.Mvc.Html" %>

и я также добавил его в файл веб-конфигурации:

<pages>
    <controls>
        ...
    </controls>
    <namespaces>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Ajax"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Routing"/>
        <add namespace="System.Linq"/>
        <add namespace="System.Collections.Generic"/>
        <add namespace="MyComp.Web.Mvc.Html"/>
    </namespaces> 
</pages>

На мой взгляд, если я пытаюсь получить доступ к Html.ActionImageLink, я получаю сообщение об ошибке, в котором говорится, что System.Web.Mvc.HtmlHelper не содержит определения для ActionImageLink, принимающего первый тип аргумента System.Web.Mvc.HtmlHelper. Я не вижу никаких методов расширения ActionLink для System.Web.Mvc.HtmlHelper, только для System.Web.Mvc.HtmlHelper, так как же это работает для платформы .net, а не для меня?


person Jeremy    schedule 21.01.2010    source источник
comment
Это странно. Похоже, ты все сделал правильно. Я предполагаю, что ошибка появляется при запуске веб-сайта, а не только в представлении кода VS?   -  person Omar    schedule 21.01.2010
comment
вы можете вставить свой код просмотра?   -  person Rony    schedule 21.01.2010
comment
@Baddie, нет, если я компилирую, VS показывает мне ошибки еще до того, как я запустил приложение.   -  person Jeremy    schedule 21.01.2010
comment
Не могли бы вы отключить MvcBuildView, отредактировав файл .csproj проекта mvc, а затем запустив код. Я сбит с толку, потому что кажется, ты все сделал правильно.   -  person Omar    schedule 21.01.2010
comment
Я пытаюсь понять, что иногда Visual Studio сообщает вам, что не может найти определенный метод (особенно в представлениях) в некотором пространстве имен, потому что он еще не распознал новое пространство имен. Иногда перестройка проекта исправляет это. Кроме того, уверены ли вы, что web.config, который вы добавили, был web.config главного приложения, а не views web.config?   -  person Omar    schedule 21.01.2010
comment
Очищенное решение, перезапуск VS, теперь вроде нормально. Не уверен, что там происходило, но, похоже, сейчас он работает. Спасибо за советы   -  person Jeremy    schedule 22.01.2010


Ответы (6)


Обратите внимание на разницу в случае вашего пространства имен при объявлении и импорте.

namespace MyComp.Web.MVC.Html
{
} 

<%@ Import Namespace="MyComp.Web.Mvc.Html" %>
<add namespace="MyComp.Web.Mvc.Html"/>

Пространства имен чувствительны к регистру!

person Anthony Serdyukov    schedule 23.01.2010
comment
Арг! Я знал, что они чувствительны к регистру, но не заметил опечатку. Но опять же, никто, кроме вас, тоже! Ха! - person Jeremy; 23.01.2010

Вы должны добавить пространство имен в web.config, но в то, что находится внутри папки просмотров.

person LastCyborg    schedule 18.08.2011

Попробуйте закрыть Visual Studio и снова открыть Решение. Иногда это помогает, когда что-то начинает вести себя странно.

person hunter    schedule 21.01.2010

Закройте и снова откройте Visual Studio!

person Shan    schedule 05.03.2014

  1. Выполняет ли VS intellisense автозаполнение вашего метода расширения? Автозаполнение стандартных методов помощников MVC? В противном случае произошла ошибка компиляции представления. Убедитесь, что у вас есть правильное значение атрибута «Наследует» в теге страницы в начале представления. Если вы используете строго типизированные представления, убедитесь, что «строгий тип» существует и компилируется.

  2. Определяете ли вы метод расширения в том же проекте, где определено представление? Если нет, вам нужно добавить ссылку в проект mvc. Наконец, проверьте, находится ли сборка с методом расширения (MyComp.Web.Mvc.Html.dll?) В папке Bin приложения

  3. Попробуйте добавить объявление пространства имен в раздел страниц / пространств имен файла web.config, размещенного в папке «Представления» в проекте MVC (а не в основном файле проекта web.config).

person PanJanek    schedule 22.01.2010

Одна из причин может заключаться в том, что вы возвращаете MvcHtmlString, а не строку. Включите пространство имен для класса MvcHtmlString. Посмотрим, поможет ли это.

person San    schedule 21.01.2010
comment
Однако существующие методы расширения ActionLink также возвращают MvcHtmlString. - person Jeremy; 21.01.2010
comment
Возвращаемое значение функции не имеет к этому никакого отношения. - person Omar; 21.01.2010
comment
Я попробовал приведенный выше код от Джереми, у меня он отлично работает. Странно, что это не работает для Джереми. - person San; 21.01.2010