找回密码
 立即注册
首页 业界区 业界 [一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper ...

[一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper

翱龟墓 2025-5-29 20:36:11
anytao.net | 《你必须知道的.NET》网站 | <label for="tao"><label class="grey" for="tao">Anytao</label></label>技术博客 
发布日期:2009.05.06 作者:<label for="tao"><label class="grey" for="tao">Anytao</label></label>
© 2009 <label for="tao"><label class="grey" for="tao">Anytao</label></label>.com ,<label for="tao"><label class="grey" for="tao">Anytao</label></label>原创作品,转贴请注明作者和出处。

对HtmlHelper进行扩展,是MVC中对于View层进行灵活控制的主要手段之一,对此我在第七回:漫谈ActionLink,有时“胡搅蛮缠”中进行过探讨。在本文,只是一个小技巧,丰富我们在自定义HtmlHelper时可以有更好的选择。
首先,我们先了解一下,几个简单的HtmlHelper扩展是如何实现:
  1. public static string Label(this HtmlHelper helper, string name, string value)
  2. {
  3.     return string.Format("<label for='{0}'>{1}</label><br />", name, value);
  4. }
复制代码
很简单,就是实现一个对HtmlHelper的扩展方法,这样我们就可以在View层通过
  1. [/code]而无需:
  2. [code]<label for="tao"><label class="grey" for="tao">Anytao</label></label>
复制代码
显然,通过Html.Lable方式更加的简洁和灵活,此例仅仅是个简单的举例。事实上,通过Html.XXX可以封装更多的预定义Html代码,实现更多有效、复杂的个性化实现,例如在本文的下一篇我将通过Html.Naviagte方式实现一个封装了Sitemap的Breadcrumb控制,从而使得我们体会更好的Html是如何做到的。
对于Html.Label而言,还有一个重要的内容需要添加,那就是对于Html标记如何动态的指定和渲染,例如我们可以对Label指定id、class还有更多其他的Html属性,这是个有市场的需求,因为至少为Dom元素指定Css是经常发生的事情,例如假设有如下的需求:
  1. <label for="tao"><label class="grey" for="tao">Anytao</label></label>
复制代码
在原有的Html.Label扩展实现中,class的指定是无法做到的,因此需要从新构造,办法就是添加htmlAttributes参数,实现类似于ActionLink一样的控制,例如:
  1. [/code]那么,我们该如何办呢?我想起了TagBuilder,来简化实现的复杂度,事实上TagBuilder就是干这个的主,废话不说给出更新之后的Html.Label实现:
  2. [code]public static string Label(this HtmlHelper helper, string name, string value, object htmlAttributes)
  3. {
  4.     TagBuilder tagBuilder = new TagBuilder("label")
  5.     {
  6.         InnerHtml = value
  7.     };
  8.     tagBuilder.MergeAttribute("for", name);
  9.     tagBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
  10.     return tagBuilder.ToString(TagRenderMode.Normal);
  11. }
复制代码
办法很简单,在Html.Label内部通过TagBuilder,实现了对htmlAttribute特性的添加,实现的办法非常简单:
  1. tagBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
复制代码
在MergeAttributes方法内部实现对Html Attribute信息的整合,有兴趣大家可以了解具体的实现规则。
既然我们的主角是TagBuilder,那么就顺便近看其面目,总体来说TagBuilder就是创建Html标签的Builder,类似于StringBuilder封装了对Html标签的很多简单而有效的方法(例如MergeAttributes),主要包括:

  • AddCssClass
  • GenerateId
  • MergeAttribute
  • SetInnerText
  • ToString
还包括几个属性:

  • Attributes
  • IdAttributeDotReplacement
  • InnerHtml
  • TagName
工欲善其事,必先利其器。TagBuidler使得HtmlHelper变得简单,自信的观众可以完全不用TagBuilder,通过任何其他的办法来实现类似于MergeAttribute、AddCssClass这样的逻辑,但是既然已经有了,不妨一试。就像它的大哥StringBuilder,给我们处理string带来多少不错的亲近感受,看面子也不妨关照一下小弟TagBuilder。
 
  1. 更多精彩,尽在anytao.net
复制代码
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册