2009-07-24 99 views
5

我一直在玩弄一些自定义的HTML帮手,现在我正在尝试做一个我可以用于jQuery AJAX UI选项卡。需要帮助建立自定义的Html Helper的Asp.net MVC

所以做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 helper,它有一个带有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”所接受。

由于

回答

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> 
3

this HtmlHelper helper意味着它是一个C#3.0“扩展方法” HtmlHelper,这是它是如何变得可用在你的视图(等)的Html实例。扩展方法是一个静态方法,假装(在编译时)是由this(在这种情况下为HtmlHelper)指定的类型上可用的实例方法。在现实中,编译器调用静态方法(Html.Button({args}))好像您已键入:

MyStaticClass.Button(Html, {args}); 

这不是必要要使用在你不需要它(inded就通过了HtmlHelper,我不要使用它here);它的主要工作(在这种情况下)是使代码方便使用(作为扩展方法);但在某些情况下它可能会有用。

1

您不必有HtmlHelper来创建适用于jQuery AJAX UI选项卡的链接。

的jQuery插件标签命名接受的tabTemplate说法,您可以设置:

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

documentation

+0

因此,我只是制作了一个div列表,并在所有herfs上放置了“#”infront? 我不确定代码应该如何。 我使用HtmlHelpers,因为我发现他们很清洁,并停止spagetti代码这就是为什么我使用它们。 我仍然想知道如何在自定义Html帮助器中调用一个制作好的Html帮助器。 – chobo2 2009-07-24 11:20:48

+0

从链接的文档: tabTemplate:从中创建和添加新选项卡的HTML模板。占位符#{href}和#{label}被替换为作为参数传递给add方法的url和tab标签。 – andymeadows 2009-07-24 13:43:51