Почему мои расширения HtmlHelper не работают?

Я создаю веб-сайт ASP.Net MVC. Вместо того, чтобы объединять все в одном проекте, я решил разделить сеть, модель и контроллер на разные проекты в одном решении, которые ссылаются друг на друга.

Ссылка выглядит так:

Интернет --- [ссылки] ---> Контроллер --- [ссылки] ---> Модель

Теперь я хотел добавить 2 собственных метода в класс HtmlHelper - они называются «IncludeScript» и «IncludeStyle». Каждый из них принимает один строковый параметр и генерирует тег скрипта или ссылки соответственно.

Я создал класс-расширитель в соответствии с документацией в Интернете, написал два метода и скомпилировал приложение.

Теперь, когда я захожу на страницу 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);

Есть идеи, что здесь может быть не так?


person Jonathan    schedule 20.10.2008    source источник
comment
Не могли бы вы вставить код сценария включения, а также проект, в котором он присутствует?   -  person Ramesh    schedule 30.12.2009


Ответы (5)


Убедитесь, что пространство имен ваших расширений доступно нашему представлению. На ваш взгляд, вам нужно либо это:

<%@ Import Namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"%>

или это в разделе пространств имен вашей веб-конфигурации:

<add namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"/>
person Tim Scott    schedule 20.10.2008
comment
Я пробовал оба - все равно ничего. Кстати, на всякий случай, я попытался сделать это в совершенно новом решении с новыми проектами и просто добавлял свои файлы, и это STILL давало мне ту же ошибку. - person Jonathan; 21.10.2008

Если вы используете строго типизированные представления и ваш метод расширения расширяет HtmlHelper<object>, он не найдет расширение. Вам нужно будет создать универсальный расширитель, чтобы расширить HtmlHelper<T>.

public static string IncludeScript<T>(this HtmlHelper<T> html, string url) {
   return "<script type=\"text/javascript\" src=\"" + url + "\"></script>";
}

Затем вы увидите, как появится ваш метод расширения.

Надеюсь, это поможет.

person Ben Lesh    schedule 30.12.2009
comment
Правильное решение здесь - вообще не включать общий - используйте this HtmlHelper html вместо общего ‹T› или ‹object›. Если, конечно, вам действительно не нужен тип модели. - person Chris Moschini; 25.10.2012

Убедитесь, что на вашей странице есть директива импорта в пространство имен ваших методов расширения.

В противном случае Visual Studio может видеть, а ваш веб-сайт - нет.

person Maxime Rouiller    schedule 20.10.2008
comment
Я помещаю в Public.Master.cs следующую строку: using PhoneReel.Web.Resources; Я также поместил следующую строку в Public.Master ‹% @ Import Namespace = PhoneReel.Web.Resources%› По-прежнему получаю ту же ошибку. - person Jonathan; 20.10.2008

Вы уверены, что для компилятора установлено значение .NET Framework 3.5? Это случилось со мной, когда я случайно установил компилятор на .NET Framework 2.0.

person Jon Limjap    schedule 20.10.2008
comment
Я проверил свойства проекта для всех трех проектов, и все они настроены на .NET Framework 3.5. - person Jonathan; 20.10.2008

В методе IncludeScript убедитесь, что вы расширяете System.Web.Mvc.HtmlHelper. Возможно, в другом пространстве имен есть HtmlHelper.

person Tim Scott    schedule 21.10.2008