需要帮助为Asp.net MVC构建Custom Html Helper

时间:2009-07-24 09:15:58

标签: c# asp.net-mvc

我一直在玩一些自定义的html帮助器,现在我正在尝试制作一个可用于jquery AJAX UI选项卡。

所以要做ajax标签,你需要在你的HTML代码中使用这种格式

<div id="example">
     <ul>
         <li><a href="ahah_1.html"><span>Content 1</span></a></li>
         <li><a href="ahah_2.html"><span>Content 2</span></a></li>
         <li><a href="ahah_3.html"><span>Content 3</span></a></li>
     </ul>
</div>

所以我不能使用ActionLink,因为我认为无论如何我都不能将标签添加到actionLink。

所以我想制作一个自己的html助手,其中包含一个带有span标签的actionLink,并且可能会在以后构建它,以便有一个无序列出的标签。

所以我不确定如何使用ActionLink来获益。就像ActionLink有10个重载方法一样,我不想重新创建所有10个方法,因为这看起来毫无意义。那么我可以参考它或类似的东西吗?

我正在使用允许自定义html助手显示“Html”的方式。在intellisense。

例如,我会:

public static string Button(this HtmlHelper helper, string id, string value)

所以我不知道如何使用我传入的这个HtmlHelper。

我也不明白这段代码“这个HtmlHelper助手”。

让我感到困惑的是在参数中使用关键字“this”。我不确定它是指什么,为什么你需要它。我也不明白如何通过传递这个参数但不使用它以某种方式允许你的客户Html帮助者被“Html”加入。

谢谢

3 个答案:

答案 0 :(得分:8)

Marc's answer很棒。只需添加一些代码:

1)与您的助手一起创建静态类:

public static class MyHtmlHelpers
{
    public static string MySpecialActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues)
    {
        var innerTagBuilder = new TagBuilder("span") {
            InnerHtml = (!String.IsNullOrEmpty(linkText)) ? HttpUtility.HtmlEncode(linkText) : String.Empty
        };

        TagBuilder tagBuilder = new TagBuilder("a") {
            InnerHtml = innerTagBuilder.ToString(TagRenderMode.Normal);
        };

        var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
        var url = urlHelper.Action(actionName, routeValues);
        tagBuilder.MergeAttribute("href", url);

        return tagBuilder.ToString(TagRenderMode.Normal);
    }
}

2)将MyHtmlHelpers类的名称空间添加到web.config:

<pages>
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Linq" />
    <add namespace="System.Collections.Generic" />

    <add namespace="MyHtmlHelpers_Namespace" />
  </namespaces>
</pages>

3)享受:):

<div id="example">
    <ul>
        <li><%= Html.MySpecialActionLink("Content 1", "action1", null) %></li>
        <li><%= Html.MySpecialActionLink("Content 2", "action2", new { param2 = "value2" }) %></li>
        <li><%= Html.MySpecialActionLink("Content 3", "action3", new { param3 = "value3" }) %></li>
    </ul>
</div>

答案 1 :(得分:3)

this HtmlHelper helper表示它是HtmlHelper上的C#3.0“扩展方法”,它是您在视图中的Html实例上可用的方式(等)。扩展方法是一种静态方法,假装(在编译时)作为this指定的类型上可用的实例方法(在本例中为HtmlHelper)。实际上,编译器调用静态方法(Html.Button({args})),就好像您键入了:

MyStaticClass.Button(Html, {args});

如果你不需要它,那么使用传入的HtmlHelper 必要(inded,我不使用它here);它的主要工作(在这种情况下)是使代码方便消费(作为扩展方法);但在某些情况下它可能很有用。

答案 2 :(得分:1)

您不必拥有HtmlHelper来创建与jQuery AJAX UI标签一起使用的链接。

jQuery tabs插件接受一个名为tabTemplate的参数,您可以设置:

$("#example").tabs({ tabTemplate: "<li><a href=\"#{href}\">#{label}</a></li>" });

请参阅documentation