你会如何重构这个Asp.net MVC 2 Html Helper?

时间:2010-06-25 07:22:54

标签: asp.net-mvc .net-4.0 c#-4.0 stringbuilder tagbuilder

快速提问。

你如何重构这个Asp.net MVC 2 HtmlHelper? 具体来说,在这种情况下使用TagBuilder类是否有意义?

        public static MvcHtmlString BusinessDisplayContacts(this HtmlHelper helper, string phone, string cellPhone, 
        string fax, string website, string email, bool hideEmail) 
    {
        StringBuilder sb = new StringBuilder();

        sb.AppendLine("<ul>");
        if (!string.IsNullOrEmpty(phone)) { 
            sb.AppendLine("<li class=\"tel\">");
            sb.AppendLine("<span class=\"type\">Work</span>:");
            sb.AppendFormat("<span class=\"value\">{0}</span>",phone);            
            sb.AppendLine("</li>");
        }
        if (!string.IsNullOrEmpty(cellPhone)) { 
            sb.AppendLine("<li class=\"tel\">");
            sb.AppendLine("<span class=\"type\">Cell</span> Phone:");
            sb.AppendFormat("<span class=\"value\">{0}</span>",cellPhone);
            sb.AppendLine("</li>");
        }
        if (!string.IsNullOrEmpty(fax)) { 
            sb.AppendLine("<li class=\"tel\">");
            sb.AppendLine("<span class=\"type\">Fax</span>:");
            sb.AppendFormat("<span class=\"value\">{0}</span>",fax);
            sb.AppendLine("</li>");
        }
        if (!string.IsNullOrEmpty(website)) { 
            sb.AppendFormat("<li><a class=\"url\" href=\"{0}\">{0}</a></li>",website);
        }
        if (!hideEmail && !string.IsNullOrEmpty(email)) {
            sb.AppendFormat("<li><a class=\"email\" href=\"mailto:{0}\">{0}</a></li>",email);
        }
        sb.AppendLine("</ul>");

        if (sb.Length < 10)
        {
            return MvcHtmlString.Create("");
        }
        else {
            return MvcHtmlString.Create(sb.ToString());
        }
    }

提前致谢。

更新:
感谢所有建设性意见。 最后我决定按照@ queen3的建议将上面的代码移到一个强类型的局部视图中。

1 个答案:

答案 0 :(得分:3)

我看到人们遗漏了很多东西,就是使用C#逐字字符串来表达这样的东西......例如。

sb.AppendLine("<li class=\"tel\">");
sb.AppendLine("<span class=\"type\">Work</span>:");
sb.AppendLine(string.Format("<span class=\"value\">{0}</span>",phone));            
sb.AppendLine("</li>");

可以制作成

sb.AppendFormat(@"
<li class=""tel"">
    <span class=""type"">Work</span>: <span class=""value"">{0}</span>
</li>
", phone);

更具可读性。

另一件事:我会将所有这些字符串+ bool放在一个对象中,比如ContactInfo或其他东西,将帮助者的签名改为BusinessDisplayContacts(this HtmlHelper helper, ContactInfo info) - 这样你就可以添加/删除/修改电话号码和条件而不破坏现有代码。