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 Framework, а не для меня?

Ответ 1

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

namespace MyComp.Web.MVC.Html
{
} 

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

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

Ответ 2

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

Ответ 3

Попробуйте выключить Visual Studio и снова открыть свое решение. Когда все начинает действовать странно, иногда это помогает.

Ответ 4

  • Выполняет ли VS intellisense автообновление вашего метода расширения? Он автоматически заполняет стандартные методы помощников MVC? Если нет, то возникла ошибка компиляции вида. Убедитесь, что у вас есть правильное значение атрибута "Inherits" в теге страницы в начале представления. Если вы используете строго типизированные представления, убедитесь, что существует "сильный тип" и компилируется.

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

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

Ответ 5

Закрыть и снова открыть Visual Studio, сделал трюк!

Ответ 6

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