5

创建自定义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>");
}

又长又干净:

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

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

4

3 回答 3

3

作为 Clean Code 的粉丝,我会选择第一种方法。即使第二种方法更“按部就班”,它也缺乏第一种方法的清晰性。

源代码应该始终以清晰的方式传达意图(嗯,它也应该起作用),所以在证明无效之前,我会使用第一种方法。

于 2014-02-10T21:20:09.303 回答
1

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

于 2014-02-21T17:17:05.203 回答
1

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

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

于 2014-11-25T21:45:34.183 回答