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

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

Ссылка выглядит следующим образом:

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

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

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

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

Любые идеи, что здесь может быть неправильным?

Ответ 1

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

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

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

<add namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"/>

Ответ 2

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

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

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

Я надеюсь, что это поможет.

Ответ 3

Обязательно укажите директиву импорта в пространство имен ваших методов расширений на странице.

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

Ответ 4

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

Ответ 5

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