创建自定义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());
}
我想知道第二种方法是否值得。
答案 0 :(得分:3)
作为清洁代码的粉丝,我会选择第一种方法。即使第二种方法更“按书”,它也缺乏第一种方法的清晰度。
源代码应该始终以清晰的方式表达意图(好吧,它也应该有效),所以在证明无效之前,我会选择第一种方法。
答案 1 :(得分:1)
我同意在这种情况下,第一种方法更清洁,因此更适合简单的情况,但它确实传达了更多责任,以使输出正确。例如,如果必须使用链接目标URL的参数值而不是字符串文字,则需要确保在编写字符串时对其进行了正确编码(转义字符等),而HtmlAnchor
class会自动为你处理。
答案 2 :(得分:1)
当我开发网页控件时,我曾问自己这个问题。为了尝试解决它,我反编译了telerik的库,然后我看到了它们如何实现Web控件。他们开发了许多组件并使用第二个近似值。
在我看来是最好的选择,因为如果控件很复杂,你的代码会变成很多string.format或类似的东西,很难理解和修改。当然第二个选项也可能不清楚,但只需很少的实用方法就可以创建高度可维护的控件。