Почему мои расширения HtmlHelper не работают?
-
03-07-2019 - |
Вопрос
Я создаю веб-сайт ASP.Net MVC.Вместо того чтобы объединять все в одном проекте, я решил разделить Веб, модель и контроллер на разные проекты в одном решении, которые ссылаются друг на друга.
Ссылка выглядит следующим образом:
Веб---[ссылки]---> Контроллер ---[ссылки]---> Модель
Теперь я хотел добавить 2 пользовательских метода в класс HtmlHelper - они называются "IncludeScript" и "IncludeStyle".Каждый из них принимает один строковый параметр и генерирует скрипт или тег ссылки соответственно.
Я создал класс extender, согласно документации в Интернете, написал два метода и скомпилировал приложение.
Теперь, когда я захожу на страницу Public.Master (которая является моей главной главной страницей и одним из мест, где я намерен использовать эти методы), я могу ввести код, подобный приведенному ниже:
<%= Html.IncludeScript("\js\jquery.js") %>
IntelliSense подбирает метод IncludeScript и просто отлично показывает мне синтаксис.Так что я бы ожидал, что все должно сработать.
Но это не так.
Все компилируется, но как только я запускаю приложение, я получаю следующую ошибку во время выполнения из строки 14 Default.aspx.cs:
c:\\Projects\\PhoneReel\\PhoneReel.Web\\Views\\Shared\\Public.Master(11): error CS0117: 'System.Web.Mvc.HtmlHelper' does not contain a definition for 'IncludeScript'
Вот строка кода, в которой возникает ошибка:
httpHandler.ProcessRequest(HttpContext.Current);
Есть какие-нибудь идеи, что здесь может пойти не так?
Решение
Убедитесь, что пространство имен ваших расширений доступно нашему просмотру.На ваш взгляд, вам нужно либо это:
<%@ Import Namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"%>
или это в разделе пространств имен вашей веб-конфигурации:
<add namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"/>
Другие советы
Если вы используете строго типизированный просмотров, и ваш метод расширения расширяется HtmlHelper<object>
, он не найдет расширение.Вам придется создать универсальный расширитель расширить HtmlHelper<T>
.
public static string IncludeScript<T>(this HtmlHelper<T> html, string url) {
return "<script type=\"text/javascript\" src=\"" + url + "\"></script>";
}
Затем вы увидите, что появится ваш метод расширителя.
Надеюсь, это поможет.
Обязательно наличие директивы импорта в пространстве имен методов расширений на вашей странице.
В противном случае Visual Studio сможет увидеть, но ваш веб-сайт не сможет.
Вы уверены, что компилятор настроен на .NET Framework 3.5?Это случилось со мной, когда я непреднамеренно установил компилятор на .NET Framework 2.0
В методе IncludeScript убедитесь, что вы расширяете System.Web.Mvc.HtmlHelper.Возможно, HtmlHelper существует в каком-то другом пространстве имен.