艾伟_转载:[一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper

本系列文章导航

[一步一步MVC]第一回:使用ActionSelector控制Action的选择

[一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理

[一步一步MVC]第三回:MVC范例大观园

[一步一步MVC]第四回:漫谈ActionLink,有时“胡搅蛮缠”

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

[一步一步MVC]第六回:什么是MVC(上)?

对HtmlHelper进行扩展,是MVC中对于View层进行灵活控制的主要手段之一,对此我在第七回:漫谈ActionLink,有时“胡搅蛮缠”中进行过探讨。在本文,只是一个小技巧,丰富我们在自定义HtmlHelper时可以有更好的选择。

首先,我们先了解一下,几个简单的HtmlHelper扩展是如何实现:


public static string Label(this HtmlHelper helper, string name, string value)
{
return string.Format("{1}
", name, value);
}

很简单,就是实现一个对HtmlHelper的扩展方法,这样我们就可以在View层通过

 


<%= Html.Label("Anytao", "tao") %>

 

而无需:

 


<label for="tao">Anytao</label>

 

显然,通过Html.Lable方式更加的简洁和灵活,此例仅仅是个简单的举例。事实上,通过Html.XXX可以封装更多的预定义Html代码,实现更多有效、复杂的个性化实现,例如在本文的下一篇我将通过Html.Naviagte方式实现一个封装了Sitemap的Breadcrumb控制,从而使得我们体会更好的Html是如何做到的。

对于Html.Label而言,还有一个重要的内容需要添加,那就是对于Html标记如何动态的指定和渲染,例如我们可以对Label指定id、class还有更多其他的Html属性,这是个有市场的需求,因为至少为Dom元素指定Css是经常发生的事情,例如假设有如下的需求:

 


<label class="grey" for="tao">Anytao</label>

 

在原有的Html.Label扩展实现中,class的指定是无法做到的,因此需要从新构造,办法就是添加htmlAttributes参数,实现类似于ActionLink一样的控制,例如:

 


<%= Html.Label("Anytao", "tao", new { @class="grey"} %>

 

那么,我们该如何办呢?我想起了TagBuilder,来简化实现的复杂度,事实上TagBuilder就是干这个的主,废话不说给出更新之后的Html.Label实现:

 


public static string Label(this HtmlHelper helper, string name, string value, 

 object htmlAttributes)
{
TagBuilder tagBuilder = new TagBuilder("label")
{
InnerHtml = value
};
tagBuilder.MergeAttribute("for", name);
tagBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
return tagBuilder.ToString(TagRenderMode.Normal);
}

 

办法很简单,在Html.Label内部通过TagBuilder,实现了对htmlAttribute特性的添加,实现的办法非常简单:

 


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。

时间: 2024-09-16 00:35:48

艾伟_转载:[一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper的相关文章

艾伟_转载:学习 ASP.NET MVC (第一回)理论篇

本系列文章导航 学习 ASP.NET MVC (第一回)理论篇 学习 ASP.NET MVC (第二回)实战篇 学习 ASP.NET MVC (第三回)实战篇 学习 ASP.NET MVC (第四回)实战篇 学习 ASP.NET MVC (第五回)理论篇 MVC三种角色:--Model:用于存储数据的组件--View:根据Model数据进行内容展示的组件--Controller:接受并处理用户指令(操作Model),选择一个View并输出内容.Controller对View进行引用,但是View

艾伟_转载:学习 ASP.NET MVC (第五回)理论篇

本系列文章导航 学习 ASP.NET MVC (第一回)理论篇 学习 ASP.NET MVC (第二回)实战篇 学习 ASP.NET MVC (第三回)实战篇 学习 ASP.NET MVC (第四回)实战篇 学习 ASP.NET MVC (第五回)理论篇 通过前几篇文章,我们通过ASP.NET MVC创建了一个简单的应用程序,学习了ASP.NET MVC的基本框架和工作流程.但是Demo中很多东西都是VS为我们自动生成的,比如View的html代码等.此文和大家一起学习一下ASP.NET MVC

艾伟_转载:学习 ASP.NET MVC (第四回)实战篇

本系列文章导航 学习 ASP.NET MVC (第一回)理论篇 学习 ASP.NET MVC (第二回)实战篇 学习 ASP.NET MVC (第三回)实战篇 学习 ASP.NET MVC (第四回)实战篇 学习 ASP.NET MVC (第五回)理论篇 我们继续ASP.NET MVC之旅.上文中我们实现了对User信息的展示,详细信息的列表,还有错误页的实现.本文继续完成添加,修改,删除的操作.首先我们来完成Controller的代码: Code//        // GET: /Users

艾伟_转载:[一步一步MVC]第六回:什么是MVC(上)?

本系列文章导航 [一步一步MVC]第一回:使用ActionSelector控制Action的选择 [一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理 [一步一步MVC]第三回:MVC范例大观园 [一步一步MVC]第四回:漫谈ActionLink,有时"胡搅蛮缠" [一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper [一步一步MVC]第六回:什么是MVC(上)? 引言 所谓MVC,其实就是M.V.C而已.归根揭底,

艾伟_转载:[一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理

本系列文章导航 [一步一步MVC]第一回:使用ActionSelector控制Action的选择 [一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理 [一步一步MVC]第三回:MVC范例大观园 [一步一步MVC]第四回:漫谈ActionLink,有时"胡搅蛮缠" [一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper [一步一步MVC]第六回:什么是MVC(上)? 由问题引出 在ASP .NET MVC中,以友好的U

艾伟_转载:[一步一步MVC]第四回:漫谈ActionLink,有时“胡搅蛮缠”

本系列文章导航 [一步一步MVC]第一回:使用ActionSelector控制Action的选择 [一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理 [一步一步MVC]第三回:MVC范例大观园 [一步一步MVC]第四回:漫谈ActionLink,有时"胡搅蛮缠" [一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper [一步一步MVC]第六回:什么是MVC(上)? MVC时代来临了,但是一开始是不被很多人接受的.可能

艾伟_转载:把委托说透(1):开始委托之旅 委托与接口

委托,本是一个非常基础的.NET概念,但前一阵子在园子里却引起轩然大波.先是Michael Tao的随笔让人们将委托的写法与茴香豆联系到了一起,接着老赵又用一系列文章分析委托写法的演变,并告诫"嘲笑孔乙己的朋友们,你们在一味鄙视"茴"的四种写法的同时,说不定也失去了一个了解中国传统文化的机会呢!". 在我个人看来,委托是.NET Framework中一个非常炫的特性,绝不会向有些评论里说的那样,根本没有机会接触.恰恰相反,我们几乎每天都会接触委托,使用委托. 其实园

艾伟_转载:正则表达式30分钟入门教程

  本文目标 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它. 如何使用本教程 最重要的是--请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门--除非你是超人 :) 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难.当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的--我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住8

艾伟_转载:使用LINQ to SQL更新数据库(中):几种解决方案

在前一篇文章中,我提出了在使用LINQ to SQL进行更新操作时可能会遇到的几种问题.其实这并不是我一个人遇到的问题,当我在互联网上寻找答案时,我发现很多人都对这个话题发表过类似文章.但另我无法满足的是,他们尽管提出了问题,却没有进行详细的剖析,只给出了解决方案(如添加RowVersion列.去除关联等),但却没有说明为什么必须这么做.这也是我写上篇的初衷,希望通过对LINQ to SQL源代码的分析,来一步一步找出解决问题的办法.本文将对这些方法一一进行讨论. 方案一:重新赋值 在Terry