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

gia*_*min 5 c# asp.net overriding coding-style web-controls

创建自定义WebControl, UserControl,Control并且需要覆盖各种 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>");
}
Run Code Online (Sandbox Code Playgroud)

长而干净:

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());
}
Run Code Online (Sandbox Code Playgroud)

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

Jos*_* M. 1

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

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