11

我正在构建一个 ASP.Net MVC 网站。我决定将 Web、模型和控制器分离到同一个解决方案中的不同项目中,这些项目相互引用,而不是在一个项目中包含所有内容。

引用是这样的:

Web ---[references]---> Controller ---[references]---> Model

现在我想向 HtmlHelper 类添加 2 个自定义方法——它们被称为“IncludeScript”和“IncludeStyle”。它们每个都接受一个字符串参数,并分别生成一个脚本或链接标签。

根据网络上的文档,我创建了一个扩展器类,并编写了这两个方法并编译了应用程序。

现在,当我进入 Public.Master 页面(这是我的主要母版页,也是我打算使用这些方法的地方之一)时,我可以输入如下代码:

<%= Html.IncludeScript("\js\jquery.js") %>

IntelliSense 采用 IncludeScript 方法并向我显示语法就好了。所以我希望一切都能正常工作。

但事实并非如此。

一切都可以编译,但只要我运行应用程序,就会从 Default.aspx.cs 的第 14 行收到以下运行时错误:

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);

任何想法这里可能出了什么问题?

4

5 回答 5

16

检查以确保我们的视图可以访问您的扩展的命名空间。在您看来,您需要:

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

或者在您的网络配置命名空间部分:

<add namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"/>
于 2008-10-20T22:25:23.723 回答
5

如果您使用强类型视图,并且您的扩展方法是 extends HtmlHelper<object>,它不会找到扩展。您必须创建一个通用扩展器来扩展HtmlHelper<T>.

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

然后你会看到你的扩展方法出现了。

我希望这会有所帮助。

于 2009-12-30T15:02:07.173 回答
1

确保在您的页面中对您的扩展方法命名空间有一个导入指令。

否则,Visual Studio 可能会看到,但您的网站将无法看到。

于 2008-10-20T02:32:12.930 回答
0

您确定编译器设置为 .NET Framework 3.5?当我无意中将编译器设置为 .NET Framework 2.0 时,这发生在我身上

于 2008-10-20T02:30:58.080 回答
0

在 IncludeScript 方法中,确保您扩展的是 System.Web.Mvc.HtmlHelper。在其他命名空间中可能存在 HtmlHelper。

于 2008-10-21T19:04:21.990 回答