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 方法的区别了吧?
    前者设置单个属性,后者设置属性组。
    
    


     


  • 相关阅读:
    How To Build CyanogenMod Android for smartphone
    CentOS安装Code::Blocks
    How to Dual boot Multiple ROMs on Your Android SmartPhone (Upto Five Roms)?
    Audacious——Linux音乐播放器
    How to Dual Boot Multiple ROMs on Your Android Phone
    Everything You Need to Know About Rooting Your Android Phone
    How to Flash a ROM to Your Android Phone
    什么是NANDroid,如何加载NANDroid备份?
    Have you considered compiled a batman-adv.ko for android?
    BATMAN—Better Approach To Mobile Adhoc Networking (B.A.T.M.A.N.)
  • 原文地址:https://www.cnblogs.com/yangda/p/3381025.html
Copyright © 2011-2022 走看看