2013-02-15 111 views
4

创建自定义WebControlUserControlControl并有覆盖各种渲染方法主要有2来完成这样的需求:最佳实践控制

的快速和肮脏的:

public override void RenderControl(HtmlTextWriter writer) 
{ 
    writer.Write("<div class=\"{0}\"><a href={1}>{2}</a>", CssClass, "/someurl.aspx", LocalizedStrings.EditLinkText); 
    base.RenderControl(writer); 
    writer.Write("</div>"); 
} 

长和清洁:

public override void RenderControl(HtmlTextWriter writer) 
{ 
    writer.WriteBeginTag(HtmlTextWriterTag.Div.ToString()); 
    writer.WriteAttribute(HtmlTextWriterAttribute.Class.ToString(), CssClass); 
    writer.Write(HtmlTextWriter.TagRightChar); 
    var link = new HtmlAnchor(); 
    link.HRef = "/someurl.aspx"; 
    link.Title = LocalizedStrings.EditLinkTitle; 
    link.InnerText = LocalizedStrings.EditLinkText; ; 
    link.Attributes.Add(HtmlTextWriterAttribute.Class.ToString(), "someclass"); 
    link.RenderControl(writer); 
    base.RenderControl(writer); 
    writer.WriteEndTag(HtmlTextWriterTag.Div.ToString()); 
} 

我在想,如果第二种方法是值得的。

+0

好的howto - 谢谢! – fubo 2014-01-20 14:29:05

回答

1

我在开发Web控件时曾问过自己这个问题。为了解决这个问题,我编译了一个telerik的库,然后我看到它们是如何实现网页控件的。他们开发了许多组件并使用第二个近似。

在我看来是最好的选择,因为如果控制是复杂的,你的代码会变成很多string.format或类似的东西,并且可能很难理解和修改。当然,第二种选择也可能不清楚,但用很少的实用方法可以创建高度可维护的控件。

3

作为Clean Code的粉丝,我会选择第一种方法。即使第二种方法更“靠书本”,它也缺乏第一种方法的清晰度。源代码应该始终以清晰的方式传达意图(当然,它也应该起作用),所以在证明无效之前,我会采用第一种方法。

1

我同意在这种情况下,第一种方法更简洁,因此对于简单案例更合适,但它确实传达了更多责任来获得正确的输出。例如,如果您必须为链接目标网址使用参数值而不是字符串文字,则在编写字符串时需要确保正确编码(转义字符等),而类将处理为你自动。