代码之家  ›  专栏  ›  技术社区  ›  Pretzel

是否可以为ASP.NET的html.actionLink()方法编写扩展方法?

  •  3
  • Pretzel  · 技术社区  · 16 年前

    现在,我正在努力解决一个IE6/7漏洞,它需要 </a> 使用此IE特定注释关闭标记,以使某些下拉菜单工作:

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

    不幸的是,我无法将其直接插入视图页面代码中,如下所示:

    <%= 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]-->");
        }
    }
    

    有什么建议吗?

    编辑: 类名重要吗?(在我的例子中,我称之为MyLinkedXTensions)

    还有,鼠标悬停时 <%= Html.ActionLink() %> 这似乎已经是一个扩展方法了。我可以扩展一个扩展方法吗?

    2 回复  |  直到 16 年前
        1
  •  6
  •   Matt Sherman    16 年前

    您可能需要将扩展名称空间放在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>
    

    这应该有助于智能感知。

        2
  •  0
  •   Mathias F    16 年前

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

    这让你有机会使用反X。 http://wpl.codeplex.com/ . 它是一个来自Microsoft的库,具有:

    • javascriptencing代码
    • 按白名单编码

    几乎所有使用Ajax和Javascript的应用程序都需要javascriptencoding,所以我认为没有这个库是没有机会的。

    如果助手使用这个库,您只需要将标签添加到白名单中,就可以开始了。

    编辑

    我刚刚在页面上看到,这对现有的HTML助手不起作用。我把这个职位一直留到MVC3。希望安提克司是包括在内的,然后开箱。