使用RenderBeginTag和RenderEndTag有什么意义

Pos*_*Guy 2 asp.net

自定义控件可以使用它来渲染span标记:

writer.RenderBeginTag(HtmlTextWriterTag.Span);  
writer.Write(Text);  
writer.RenderEndTag();
Run Code Online (Sandbox Code Playgroud)

好的,为什么我不能这样做:

writer.Write("<span>");
writer.Write(Text);
writer.Write(</span>");
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我实际上可以看到它而不是在整个地方读取HtlmlTextWriter标记,并且还可以轻松地调整任何标记,例如向标记添加cs类,id或whaetver.如果你说由于Intellisense打字速度更快,这是使用RenderBegin和RenderEnd的唯一原因吗?这不是一个案例.

Sea*_*ema 5

在我工作的地方,我们在我们的大型自定义控件套件中专门使用RenderBeginTag()/ RenderEndTag()技术,并且通常避免直接调用Write("").有几个很好的理由:

  • 正如Patrick所指出的那样,通过使用RenderBeginTag()/ RenderEndTag(),您不会在名称中意外地发出带有拼写错误的元素.

  • 使用RenderBeginTag()/ RenderEndTag(),ASP.NET运行时将告诉您是否发出了错误的标记 - 如果您忘记了先前RenderBeginTag()的匹配RenderEndTag(),ASP.NET将抛出异常你的页面.这使得非闭合元素变得非常困难.

  • 同样,你不能以这种方式不匹配结束标签--- <div>必须用</ div>结束,并且不能用</ span>意外结束.

  • AddAttribute()方法允许将复杂的单个元素的渲染划分为逻辑块:此方法添加适当的CSS类名,正确计算属性,并且该方法添加了特殊的自定义foo属性.使用StringBuilder执行这种元素程序集是可能的,但它可能更容易出错.

  • 工具可以自动,可靠地为您找到用法.如果我想知道我们的控件中发出的每一行代码,比如一个span,我可以只搜索HtmlTextWriterTag.Span的用法.搜索"<span"有点容易出错,如果"<"与"span"分开写出,可能会错过一些用法(在跨度之间来回切换的控件中就是这种情况)和一个取决于Enabled标志元素).

  • 扩展方法可以在AddAttribute()方法上扩展,以更复杂的方式添加属性:我们有一个AddNonNullClassnames()扩展方法,它从传入的多个字符串中的任何一个构造class属性,既不是null也不是空的,它是在构建复杂的控件方面证明了天赐之物,这些控件仍然可以通过CSS完全样式化.

  • ASP.NET将尝试(尝试,我说)根据元素的嵌套程度对输出进行适当的缩进.它并不总是成功,但它的结果更好地用于调试,而不仅仅是将所有HTML发布在一行上,或者在左列上粉碎.

(为了记录,我们使用纯CSS布局--- 手表上没有基于表格的布局,谢谢!---这些技术也有帮助.)

我起初对自己很反感 - 它很长,而且冗长,专有,就像你提到的那样,来自开源背景我起初发现它很臭 - 但经过三年的工作有了它,我可以说它使代码更加灵活,使某些复杂的操作更容易,并为输出增加了惊人的安全性和清洁度.