UrlHelper扩展方法调用编码未执行

时间:2009-04-20 15:39:00

标签: asp.net-mvc extension-methods urlhelper

我为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窗体视图引擎中的错误吗?

3 个答案:

答案 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窗体渲染引擎中的一个错误或类似的东西。