【问题标题】:UrlHelper extension method call encoded not executedUrlHelper 扩展方法调用编码未执行
【发布时间】:2009-04-20 15:39:00
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这个问题已经出现了很多次。问题的根源在于

    标签有 runat="server",导致解析器将标签视为服务器标签。

    最简单的解决方法是从 head 标签中删除 runat="server"。您失去的是使链接 URL 相对于当前页面的逻辑,但是由于您无论如何都在使用您的帮助程序,所以您不需要这样做。

    【讨论】:

      【解决方案2】:

      当我遇到这个问题时,是因为我的扩展方法位于 web.config 中未指定的命名空间中。

      <add namespace="Your.Extension.Method.Namespace"/>
      

      它位于 configuration\system.web\pages\namespaces

      【讨论】:

      • 谢谢,但包含我的扩展方法的命名空间在 web.config 中,我仍然看到相同的行为。
      • 谢谢,我自己也遇到过这个。也没有注意到有2个web.configs
      【解决方案3】:

      我认为你发现了一个错误!

      我试过了,发现这只发生在母版页的 head 部分,并且只发生在 &lt;link&gt; 标签中(&lt;script&gt; 标签渲染正常)。

      问题显然是 de href 属性中的文本没有正确解释为代码块。

      这超出了 ASP.NET MVC。我在一个经典的 Web 窗体 ASP.NET 站点的母版页中尝试了它,但问题仍然存在。这似乎是 Web 表单渲染引擎中的错误或类似的东西。

      【讨论】:

      • 感谢您的确认和更多详细信息。在这一点上,解决方法虽然很老套,但足够简单且不具侵入性。再次感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多