代码之家  ›  专栏  ›  技术社区  ›  Anders

使用一些标记生成器或StringBuilder生成对象标记是更好的做法吗?ASP.NET MVC

  •  1
  • Anders  · 技术社区  · 14 年前

    我写了一个HTML助手来生成YouTube嵌入链接。它有三个参数:youtubeid、宽度和高度。我最初是用一个StringBuilder编写的,但后来我决定尝试使用TagBuilder(好吧,其中一些)。

    以下是两种不同的回报:

    //Tag Builder
    public static string YouTube(this HtmlHelper helper, string youtubeId, string width, string height)
    {
        const string vidSuffix = "&hl=en_US&fs=1";
        var url = "http://www.youtube.com/v/" + youtubeId + vidSuffix;
    
        var objBuilder = new TagBuilder("object");
        objBuilder.MergeAttribute("width",width);
        objBuilder.MergeAttribute("height",height);
    
        var movParamBuilder = new TagBuilder("param");
        movParamBuilder.MergeAttribute("name","movie");
        movParamBuilder.MergeAttribute("value",url);
    
        var fsParamBuilder = new TagBuilder("param");
        fsParamBuilder.MergeAttribute("name","allowFullScreen");
        fsParamBuilder.MergeAttribute("value","true");
    
        var saParamBuilder = new TagBuilder("param");
        saParamBuilder.MergeAttribute("name", "allowscriptaccess");
        saParamBuilder.MergeAttribute("value", "always");
    
        var embedBuilder = new TagBuilder("embed");
        embedBuilder.MergeAttribute("src",url);
        embedBuilder.MergeAttribute("type", "application/x-shockwave-flash");
        embedBuilder.MergeAttribute("allowscriptaccess","always");
        embedBuilder.MergeAttribute("allowfullscreen","true");
        embedBuilder.MergeAttribute("width",width);
        embedBuilder.MergeAttribute("height",height);
    
        objBuilder.InnerHtml = movParamBuilder.ToString(TagRenderMode.Normal) +
                               fsParamBuilder.ToString(TagRenderMode.Normal) +
                               saParamBuilder.ToString(TagRenderMode.Normal) +
                               embedBuilder.ToString(TagRenderMode.Normal);
    
        return objBuilder.ToString(TagRenderMode.Normal);
    }
    
    
    //StringBuilder
    public static string YouTube(this HtmlHelper helper, string youtubeId, string width, string height)
    {
        const string vidSuffix = "&hl=en_US&fs=1";
        var url = "http://www.youtube.com/v/" + youtubeId + vidSuffix;
    
        sb.AppendFormat("<object width=\"{0}\" height=\"{1}\">", width, height);
        sb.AppendLine();
        sb.AppendFormat("<param name=\"movie\" value=\"{0}\">",url);
        sb.AppendLine();
        sb.Append("</param><param name=\"allowFullScreen\" value=\"true\">");
        sb.AppendLine();
        sb.AppendFormat("</param><param name=\"allowscriptaccess\" value=\"always\">");
        sb.AppendLine();
        sb.AppendFormat(
            "</param><embed src=\"{0}\" type=\"application/x-shockwave-flash\" allowscriptaccess=\"always\" allowfullscreen=\"true\" width=\"{1}\" height=\"{2}\">",
            url, width, height);
        sb.AppendLine();
        sb.Append("</embed></object>");
    
        return sb.ToString();
    }
    

    它们都生成完全相同的代码,只是StringBuilder在每个部分后添加了一个换行符。

    想一想哪种更好,哪种更重要?谢谢!

    1 回复  |  直到 14 年前
        1
  •  2
  •   tvanfosson    14 年前

    我认为我更愿意重构它,一个可能是私有的方法来生成每个参数标记,减少代码重复,否则我更喜欢StringBuilder。

    private static string Param( this HtmlHelper helper, string name, string value )
    {
        var tagBuilder = new TagBuilder("param"); 
        tagBuilder .MergeAttribute("name", name); 
        tagBuilder .MergeAttribute("value", value);
        return tagBuilder.ToString( TagRenderMode.Normal );
    }
    
    public static string YouTube(this HtmlHelper helper, string youtubeId, string width, string height) 
    { 
        const string vidSuffix = "&amp;hl=en_US&amp;fs=1"; 
        var url = "http://www.youtube.com/v/" + youtubeId + vidSuffix; 
    
        var objBuilder = new TagBuilder("object"); 
        objBuilder.MergeAttribute("width",width); 
        objBuilder.MergeAttribute("height",height);  
    
        var embedBuilder = new TagBuilder("embed"); 
        embedBuilder.MergeAttribute("src",url); 
        embedBuilder.MergeAttribute("type", "application/x-shockwave-flash"); 
        embedBuilder.MergeAttribute("allowscriptaccess","always"); 
        embedBuilder.MergeAttribute("allowfullscreen","true"); 
        embedBuilder.MergeAttribute("width",width); 
        embedBuilder.MergeAttribute("height",height); 
    
        objBuilder.InnerHtml = helper.Param( "movie", url ) + 
                               helper.Param( "allowFullScreen", "true" ) + 
                               helper.Param( "allowscriptaccess", "always" ) + 
                               embedBuilder.ToString(TagRenderMode.Normal); 
    
        return objBuilder.ToString(TagRenderMode.Normal); 
    }