可以为ASP.NET的Html.ActionLink()方法编写扩展方法吗?

时间:2010-06-16 18:27:57

标签: asp.net-mvc extension-methods actionlink html.actionlink

现在,我正在尝试解决一个IE6 / 7错误,该错误要求使用此IE特定注释包装</a>结束标记,以使某些下拉菜单工作:

<!--[if IE 7]><!--></a><!--<![endif]-->

不幸的是,我不能将它直接注入到我的View页面代码中:

<%= Html.ActionLink("LinkName<!--[if IE 7]><!--></a><!--<![endif]-->","Action","Controller") %>

由于Html.ActionLink将执行安全操作并过滤掉注释以防止Javascript注入攻击。好的。我很好。好的设计决定。

我想要做的就是为此编写一个扩展方法,但是这个过程正在躲避我,因为我之前没有这样做过。

我认为这样可行,但Intellisense似乎没有采用我编写的这种扩展方法。

public static class MyLinkExtensions
{
    public static string ActionLinkIE(this HtmlHelper htmlHelper,  
        string linkText, string actionName, string controllerName)
    {
        return LinkExtensions.ActionLink(htmlHelper, linkText, actionName, controllerName).
            Replace(@"</a>", @"<!--[if IE 7]><!--></a><!--<![endif]-->");
    }
}

有什么建议吗?

编辑:班级名称是否重要? (就我而言,我称之为MyLinkExtensions)

此外,鼠标悬停在<%= Html.ActionLink() %>上时,似乎已经是扩展方法了。我可以扩展扩展方法吗?

2 个答案:

答案 0 :(得分:6)

您可能需要将您的Extensions命名空间放在web.config中:

<pages>      
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Linq" />
        <add namespace="Pretzel.Extensions.Html" />
      </namespaces>
</pages>

这应该有助于Intellisense。

答案 1 :(得分:0)

您可以根据phil haack的这篇文章更改用于编码输出的库 http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp-net.aspx

这使您有机会使用ANtiXss http://wpl.codeplex.com/。这是一个来自微软的图书馆:

  • JavascriptEncoding
  • 按白名单编码

几乎所有使用ajax和javascript的应用程序都需要JavascriptEncoding,所以我认为没有机会没有这个库。

如果帮助者使用此库,您只需将标记添加到白名单即可。

修改

我刚刚在页面上看到这对现有的Html Helper不起作用:-(。好吧,我把这篇文章保留到MVC3。希望AnTiXss包含在内,然后开箱即用。