我为ASP.NET MVC UrlHelper创建了一个简单的扩展方法。它不需要参数,因为它的工作是从配置中查找样式表文件的名称并将url返回到样式表。扩展方法看起来大致如下:
public static string SiteStylesheet(this UrlHelper urlHelper)
{
var scriptFilename = UserInterfaceConfiguration.GetSection()
.Mvc.SiteStylesheet;
return urlHelper.Content(string.Format("~/Assets/Scripts/{0}",
scriptFilename));
}
我这样使用它:
<link href="<%= Url.SiteStylesheet() %>" rel="Stylesheet" type="text/css" />
但是,该方法不会被执行,并呈现以下内容:
href="../Views/Shared/%3C%25=%20Url.SiteStylesheet()%20%25%3E"
正如您所看到的,扩展方法没有被执行,而是整个事情只是被编码。如果我更改方法签名以接受参数:
public static string SiteStylesheet(this UrlHelper urlHelper, string dummy)
然后执行扩展方法,输出符合预期:
href="/Assets/Stylesheets/FluidCMS.css"
那么我的问题是设计或者这是ASP.NET MVC Web窗体视图引擎中的错误吗?
答案 0 :(得分:3)
当我遇到此问题时,原因是我的扩展方法位于web.config中未指定的命名空间中。
<add namespace="Your.Extension.Method.Namespace"/>
它位于configuration \ system.web \ pages \ namespaces
下答案 1 :(得分:3)
这个问题多次出现过。该问题的根源是&lt; head&gt; tag有runat =“server”,这会导致解析器将标记视为服务器标记。
最简单的解决方法是从head标记中删除runat =“server”。你失去的是使链接URL相对于当前页面的逻辑,但是既然你正在使用你的助手,你就没有必要这样做。
答案 2 :(得分:0)
我认为你发现了一个错误!
我试了一下,发现这只发生在母版页的头部,而且仅在<link>
标签中发出(<script>
标签渲染正常)。
问题显然是de href属性中的文本未正确解释为代码块。
这超越了ASP.NET MVC。我在经典Web窗体ASP.NET站点的Master Page中尝试了它,问题仍然存在。它似乎是Web窗体渲染引擎中的一个错误或类似的东西。