Почему не работают мои расширения HtmlHelper? - PullRequest
11 голосов
/ 20 октября 2008

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

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

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

Теперь я хотел добавить 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);

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

Ответы [ 5 ]

16 голосов
/ 21 октября 2008

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

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

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

<add namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"/>
5 голосов
/ 30 декабря 2009

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

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

Тогда вы увидите, как появился ваш метод экстендера.

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

1 голос
/ 20 октября 2008

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

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

0 голосов
/ 21 октября 2008

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

0 голосов
/ 20 октября 2008

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

...