在很多项目中,可能我们需要写一些通用的控件标签,今天来简单的学习一下吧。

在前文中已经学习了 如何自定义MVC控件标签 ,感兴趣的朋友可以去看看。

今天主要还是讲解一下TagBuilder

我们打开源码可以看到TagBuilder提供了一些常用的方法。

 public class TagBuilder
{
public void AddCssClass(string value);
private void AppendAttributes(StringBuilder sb); public static string CreateSanitizedId(string originalId, string invalidCharReplacement);
public void GenerateId(string name); public void MergeAttribute(string key, string value, bool replaceExisting); public void MergeAttributes<TKey, TValue>(IDictionary<TKey, TValue> attributes, bool replaceExisting);
public void SetInnerText(string innerText);
internal HtmlString ToHtmlString(TagRenderMode renderMode);
public override string ToString();
public string ToString(TagRenderMode renderMode); // Properties
public IDictionary<string, string> Attributes { get; private set; }
public string IdAttributeDotReplacement { get; set; }
public string InnerHtml { get; set; }
public string TagName { get; private set; } }
AddCssClass:
    即在标签中添加一个 "class" 标签,这个不用多说了。
AppendAttributes
    这个方法是一个私有方法,用于最终生成属性的一个方法。内部是遍历Attributes属性,用StringBuilder进行拼接生成。
GenerateId
    首先判断当前标签是否存在"ID"这个属性,如果不存在则调用CreateSanitizedId方法传入ID的值,以及IdAttributeDotReplacement属性值,IdAttributeDotReplacement是用于替换无效字符的字符串,假如你传入的ID是 “STRSD.1”,设置的 IdAttributeDotReplacement 的值为“_”,那么最终生成的ID就是“STRSD_1”.
 在内部方法中首先会判断是否传入的为空,为空的话就直接返回HtmlHelper类的IdAttributeDotReplacement特性。内部再根据一定规则和验证进行生成,具体我就不细说了。
ToHtmlString:
  
这个方法的形参是TagRenderMode枚举,我们来看看此枚举。
public enum TagRenderMode
{
Normal, //正常文本模式
StartTag, //开始标记(例如,<tag>)的模式
EndTag, //结束标记(例如,</tag>)的模式
SelfClosing //自结束标记(例如,<tag />)的模式
}

  可以很清楚的理解吧。每次生成html的时候,都需要传递一个TagRenderMode枚举的参数。

ToHtmlString 方法内部创建了一个HtmlString对象,实参也是调用了TagBuilder类的重写ToString方法。

ToString
  这个方法就是根据传递过来的TagRenderMode参数来形成对应的呈现标签模式。我们不妨可看看。
 public string ToString(TagRenderMode renderMode)
{
StringBuilder sb = new StringBuilder();
switch (renderMode)
{
case TagRenderMode.StartTag:
sb.Append('<').Append(this.TagName);
this.AppendAttributes(sb);
sb.Append('>');
break; case TagRenderMode.EndTag:
sb.Append("</").Append(this.TagName).Append('>');
break; case TagRenderMode.SelfClosing:
sb.Append('<').Append(this.TagName);
this.AppendAttributes(sb);
sb.Append(" />");
break; default:
sb.Append('<').Append(this.TagName);
this.AppendAttributes(sb);
sb.Append('>').Append(this.InnerHtml).Append("</").Append(this.TagName).Append('>');
break;
}
return sb.ToString();
}
可见,这四种模式就一目了然了吧。
  StartTag:生成一个开始标签,再通过调用AppendAttributes方法,也就是我们之前提到过的方法。
  EndTag:生成一个结束标签
  SelfClosing:生成一个自结束标签。

除此之外都是生成一个有开始和结束的正常的标签。
 
 MergeAttribute 和 MergeAttributes 方法
  
这两个方法都存在一个重载方法,两个重载的MergeAttribute方法,都具有一个replaceExisting 的形参,作用在于判断存在某个特性的时候是否覆盖掉之前的特性,是以属性名作为key来查找的。如果传递设为true,那么之前的同名的属性的值就会被覆盖掉,反之亦然。
MergeAttributes<TKey, TValue> 是一个泛型方法。该方法的形参为 IDictionary<TKey, TValue> attributes,传递属性集合,通过遍历所有集合 然后调用MergeAttribute方法挨个设置属性。

现在应该知道 MergeAttribute 和 MergeAttributes 方法的区别了吧?
前者设置单个属性,后者设置属性组。


 
												

浅谈标签构建——TagBuilder的更多相关文章

  1. 浅谈java构建工具的选择

    在学校的时候还总是自己用eclipse自带的jar导出工具,然后人工来给项目打包,那是相当的原始. 而后工作了,项目中都是用ant,慢慢的开始学会使用这个工具.感觉就和脚本一样,很容易读懂,做项目构建 ...

  2. 浅谈自动化构建之grunt

    自动化构建 开发行业的自动化构建 一句话把源代码转化为生产代码,作用是脱离运行环境兼容带来的问题开发阶段使用提高效率的语法,规范 和标准,构建转换那些不被支持的特性转化成能够执行的代码. 一.简单的自 ...

  3. 浅谈自动化构建之gulp

    一.gulp的基本使用 gulp是目前最流行的前端自动化构建系统,核心特点高效易用.(这块不过多的废话了,直接上干货了,有兴趣的话,可以查下gulp简介) 步骤如下: yarn init -y yar ...

  4. 【转】Android Canvas的save(),saveLayer()和restore()浅谈

    Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22      阅读:1445      评论:0      收藏: ...

  5. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  6. 浅谈 js 语句块与标签

    原文:浅谈 js 语句块与标签 语句块是什么?其实就是用 {} 包裹的一些js代码而已,当然语句块不能独立作用域.可以详细参见这里<MDN block> 也许很多人第一印象 {} 不是对象 ...

  7. 浅谈dedecms模板引擎工作原理及其自定义标签

    浅谈dedecms模板引擎工作原理: 理解织梦模板引擎有什么意思? 可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步. 理解织梦会使我们写PHP代码是更顺手,同时能学 ...

  8. 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)

    虚拟化构建二分图 ------BZOJ2080 题解+浅谈几道双栈排序思想的题 本题的题解在最下面↓↓↓ 不得不说,第一次接触类似于双栈排序的这种题,是在BZOJ的五月月赛上. [BZOJ4881][ ...

  9. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

随机推荐

  1. 利用ICommand和ITool重写Arcengine中控件的事件

    Arcengine窗体开发中,不同命令或者工具可能会触发同一控件的同一事件,这样会造成该事件中代码的混乱.以主窗体的AxMapcontrol控件为例,当开始画图时因为有很多种类型的Feature,所以 ...

  2. Effective Java2读书笔记-创建和销毁对象(三)

    第5条:避免创建不必要的对象 本条主要讲的是一些反面教材,希望大家引以为鉴. ①无意中使用自动装箱导致多创建对象. public class Sum { public static void main ...

  3. undefined reference to `png_set_longjmp_fn'

    这个是在Linux上编译项目的时候,一个动态库层用到的一个函数实现未找到,即使我链接了libpng2也没有找到,原因是这个库老了一些,没有这个函数定义,需要链接更高版本的png库,CentOS上有了在 ...

  4. Structs2中Action返回json到前台方法

    1.传统方式JSON输出 这一点跟传统的Servlet的处理方式基本上一模一样,代码如下 01 public void doAction() throws IOException{ 02        ...

  5. Xcopy参数介绍

    DOS批处理命令,永远是不朽的命令,不仅功能强大,同时,速度也是最快的!但是,很多新手学习计算机,都已经遗忘了本不该忘记的批处理命令. 我们不可数典忘祖,该学习的还是要学习,不该忘记的还是不能忘记,尤 ...

  6. iphone 6s pp助手 越狱

    https://www.apple.com/iphone-6/合适初高中学习英语http://www.travelchinaguide.comhttp://jailbreak.25pp.com/ ip ...

  7. PHP MySQL Insert Into 之 Insert

    向数据库表插入数据 INSERT INTO 语句用于向数据库表添加新记录. 语法 INSERT INTO table_name VALUES (value1, value2,....) 您还可以规定希 ...

  8. UGUI 锚点

    今天我们来学习下UGUI的锚点, 他是做什么的呢?  基本上就是用于界面布局. 1. 1个控件对应1个描点. 2. 描点分成四个小叶片,  每1个叶片 对应 控件四边框的角点 3. 不管屏幕如何放大缩 ...

  9. PHP在Windows下安装配置第一步

    第一步就是下载和安装PHP解释器了: 1.下载Windows版本号的PHP解释器,下载地址:官方下载 我下载的是 VC11 x64 Thread Safe 这个以下的zip包 2.下载完毕后,解压到 ...

  10. [jQuery] 自做 jQuery Plugin - Part 1

    有時候寫 jQuery 時,常會發現一些簡單的效果可以重複利用.只是每次用 Copy & Paste 大法似乎不是件好事,有沒有什麼方法可以讓我們把這些效果用到其他地方呢? 沒錯,就是用 jQ ...