zoukankan      html  css  js  c++  java
  • 浅谈标签构建——TagBuilder

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

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

    今天主要还是讲解一下TagBuilder

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

     1 public class TagBuilder
     2 {
     3     public void AddCssClass(string value);
     4     private void AppendAttributes(StringBuilder sb);
     5 
     6     public static string CreateSanitizedId(string originalId, string invalidCharReplacement);
     7     public void GenerateId(string name);
     8     
     9     public void MergeAttribute(string key, string value, bool replaceExisting);
    10     
    11     public void MergeAttributes<TKey, TValue>(IDictionary<TKey, TValue> attributes, bool replaceExisting);
    12     public void SetInnerText(string innerText);
    13     internal HtmlString ToHtmlString(TagRenderMode renderMode);
    14     public override string ToString();
    15     public string ToString(TagRenderMode renderMode);
    16 
    17     // Properties
    18     public IDictionary<string, string> Attributes { get; private set; }
    19     public string IdAttributeDotReplacement { get; set; }
    20     public string InnerHtml { get; set; }
    21     public string TagName { get; private set; }
    22 
    23
    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参数来形成对应的呈现标签模式。我们不妨可看看。
     1 public string ToString(TagRenderMode renderMode)
     2 {
     3     StringBuilder sb = new StringBuilder();
     4     switch (renderMode)
     5     {
     6         case TagRenderMode.StartTag:
     7             sb.Append('<').Append(this.TagName);
     8             this.AppendAttributes(sb);
     9             sb.Append('>');
    10             break;
    11 
    12         case TagRenderMode.EndTag:
    13             sb.Append("</").Append(this.TagName).Append('>');
    14             break;
    15 
    16         case TagRenderMode.SelfClosing:
    17             sb.Append('<').Append(this.TagName);
    18             this.AppendAttributes(sb);
    19             sb.Append(" />");
    20             break;
    21 
    22         default:
    23             sb.Append('<').Append(this.TagName);
    24             this.AppendAttributes(sb);
    25             sb.Append('>').Append(this.InnerHtml).Append("</").Append(this.TagName).Append('>');
    26             break;
    27     }
    28     return sb.ToString();
    29 }
    可见,这四种模式就一目了然了吧。
      StartTag:生成一个开始标签,再通过调用AppendAttributes方法,也就是我们之前提到过的方法。
      EndTag:生成一个结束标签
      SelfClosing:生成一个自结束标签。

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

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


     


  • 相关阅读:
    BOM和DOM
    前端CSS
    前端HTML
    索引 创建用户和授权 锁 事务
    多表查询 Naricat pymysql
    外键关联的修改 级联 修改表行记录的操作
    表的基础数据类型 MySQL的mod设置 表的约束
    数据库初识及操作命令
    LINUX 下LAMP之源码环境部署
    Nginx负载均衡配置实例详解【原】
  • 原文地址:https://www.cnblogs.com/yangda/p/3381025.html
Copyright © 2011-2022 走看看