2008-10-20 2 views
11

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

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

Web --- [ссылка] ---> контроллер --- [ссылка] ---> Модель

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

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

+0

Не могли бы вы вставить код сценария Include, а также проект, в котором он присутствует? – Ramesh 2009-12-30 15:25:04

ответ

16

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

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

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

<add namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"/> 
+1

Я пробовал оба - все равно ничего. BTW, на всякий случай, я попытался сделать это в совершенно новом решении с новыми проектами и просто добавить свои файлы, и это * STILL * дает мне ту же ошибку. – Jonathan 2008-10-21 01:35:05

+1

Это работает для меня! Спасибо за Ваш ответ! – 2010-10-30 18:20:33

0

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

+0

Я проверил свойства проекта для всех трех проектов, и все они настроены на .NET Framework 3.5. – Jonathan 2008-10-20 02:34:36

1

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

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

+0

Я поместил следующую строку в Public.Master.cs: using PhoneReel.Web.Resources; Я также поставил следующую строку в Public.Master <% @ Import Namespace = "PhoneReel.Web.Resources" %> все еще получаю ту же самую ошибку. – Jonathan 2008-10-20 02:45:18

0

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

5

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

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

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

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

Смежные вопросы