自定义控件可以使用它来渲染span标记:
writer.RenderBeginTag(HtmlTextWriterTag.Span);
writer.Write(Text);
writer.RenderEndTag();
好的,为什么我不能这样做:
writer.Write("<span>");
writer.Write(Text);
writer.Write(</span>");
这样我实际上可以看到它,而不是在整个地方读取HtlmlTextWriter标记,并且还可以轻松地调整任何标记,例如向标记添加cs类,id或whaetver。如果你说由于Intellisense打字速度更快,这是使用RenderBegin和RenderEnd的唯一原因吗?这不是一个案例。
答案 0 :(得分:5)
在我工作的地方,我们在我们的大型自定义控件套件中专门使用RenderBeginTag()/ RenderEndTag()技术,并且通常避免直接调用Write(“”)。有几个很好的理由:
正如帕特里克所说,通过使用RenderBeginTag()/ RenderEndTag(),您不会意外地在名称中发出带有拼写错误的元素。
使用RenderBeginTag()/ RenderEndTag(),ASP.NET运行时会告诉您是否发出了错误的标记 - 如果您忘记了以前的RenderBeginTag(),ASP的匹配RenderEndTag()。 NET将在您的页面上抛出异常。这使得很难拥有一个未闭合的元素。
同样,你也不能以这种方式错配结束标签---&lt; div&gt;必须以&lt; / div&gt;结尾,并且不能以&lt; / span&gt;意外结束。
AddAttribute()方法允许将复杂的单个元素的渲染划分为逻辑块:此方法添加适当的CSS类名,正确计算值属性,以及该方法在那里添加了一个特殊的自定义 foo 属性。可以使用StringBuilder进行这种元素组装,但它可能更容易出错。
工具可以自动,可靠地为您找到用法。如果我想知道我们的控件中发出的每一行代码,比如一个span,我可以只搜索HtmlTextWriterTag.Span的用法。搜索“&lt; span”更容易出错,如果“&lt;”可能会错过一些用法。与“span”分开写出(根据启用,在 span 和 a 元素之间来回切换的控件中的情况标志)。
扩展方法可以在AddAttribute()方法上扩展,以更复杂的方式添加属性:我们有一个AddNonNullClassnames()扩展方法,可以从多个字符串中的任何一个构造类属性传入的既不是null也不是空的,并且在构建复杂的控件时证明是天赐之物,这些控件仍然可以通过CSS完全样式化。
ASP.NET将尝试(尝试,我说)根据元素的嵌套程度对输出进行适当的缩进。它并不总是成功,但它的结果更适合调试,而不仅仅是将所有HTML发布在一行上,或者在左栏上粉碎。
(为了记录,我们使用纯CSS布局--- 我的手表没有基于表格的布局,谢谢!---这些技术也有帮助。)< / p>
我起初对自己很反感 - 它很长,而且冗长,专属,就像你所说的那样,来自开源背景我起初发现它很臭 - 但是在三个之后多年的工作,我可以说它使代码更加灵活,使某些复杂的操作更容易,并为输出增加了惊人的安全性和清洁度。
答案 1 :(得分:2)
您的拼写错误会更少(因为"<spsn>"
不会出现编译错误,但HtmlTextWriterTag.Spsn
会出错。
也许不是在这种情况下,但使用已定义的标签将使以后更容易在代码中应用更改。如果由于某些奇怪的原因,span将被命名为其他名称,可以在一个地方轻松更改标签Span的值,有效地更改所有位置,而不是手动更改您使用字符串值的每个位置...
答案 2 :(得分:1)
RenderBeginTag将添加您在调用之前添加的所有属性。所以这是一种在写出html时动态添加属性的简单方法。
答案 3 :(得分:0)
除了此处的其他响应之外,它还允许HtmlTextWriter
轻松实现某些标记的自定义处理。例如,Html32TextWriter
具有属性ShouldPerformDivTableSubstitution
,允许它为仅支持HTML 3.2的旧用户代理的表替换div。
这些天可能并不常见,但仍然如此。
但是我认为它处理属性的方式是最具决定性的好处。如果你真的认为在StringBuilder中构建属性并确保它们被正确引用和编码更容易,那么祝你好运!