自定义UrlHelper方法未包含在内

时间:2013-02-17 23:28:34

标签: c# asp.net-mvc-3 extension-methods

我制作了一个自定义助手,我试图将其包含在所有页面中。

助手:

namespace project.CacheBreaker
{
 public static class CacheBreaker
 {
    public static void CacheBreak(
        this UrlHelper url, string contentPath)
    {
        url.Content(contentPath);
    }
 }
}

我试图从web.config

中公开它
<system.web>
 <pages>
  <namespaces>
    <add namespace="project.CacheBreaker"/>
  </namespaces>
 </pages>
</system.web>

我在尝试在视图中访问它时遇到错误:

<script src="@Url.CacheBreak("~/Scripts/link.js")" type="text/javascript"></script>

其中说:

"Description: An error occurred during the compilation of a resource required
to service this request. Please review the following specific error details 
and modify your source code appropriately."
"Compiler Error Message: CS1061: 'System.Web.Mvc.UrlHelper' does not contain 
a definition for 'CacheBreak' and no extension method 'CacheBreak' accepting a 
first argument of type 'System.Web.Mvc.UrlHelper' could be found 
(are you missing a using directive or an assembly reference?)"

我以为我已经采取了所有必要的步骤,为什么这个自定义方法不可用?

1 个答案:

答案 0 :(得分:1)

但你的UrlHelper不会返回任何内容。这是无效的。你不能用@Url.CacheBreak(...)来称呼它。如果您希望以这种方式使用帮助器,则应返回IHtmlStringstring

public static string CacheBreak(this UrlHelper url, string contentPath)
{
    return url.Content(contentPath);
}

哦,顺便说一下,只有Url.Content的帮助似乎有点无用,因为你可以直接写一下:

<script src="@Url.Content("~/Scripts/link.js")" type="text/javascript"></script>

你在问题​​中谈到的wbe.config似乎也是错误的wbe.config。你知道,有一个~/web.config,还有一个~/Views/web.config,它们是两个完全不同的文件。如果您使用的是Razor视图引擎,则应在~/Views/web.config文件中定义命名空间:

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />

        <add namespace="project.CacheBreaker"/>
      </namespaces>
    </pages>
</system.web.webPages.razor>