在Asp.net WebControls,UserControls,Controls上覆盖Render方法时的最佳实践

时间:2013-02-15 09:39:12

标签: c# asp.net coding-style override web-controls

创建自定义WebControlUserControlControl时,需要覆盖各种Render方法,主要有两种方法可以实现此目的:

快速又脏兮兮的:

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());
}

我想知道第二种方法是否值得。

3 个答案:

答案 0 :(得分:3)

作为清洁代码的粉丝,我会选择第一种方法。即使第二种方法更“按书”,它也缺乏第一种方法的清晰度。

源代码应该始终以清晰的方式表达意图(好吧,它也应该有效),所以在证明无效之前,我会选择第一种方法。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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