gpt4 book ai didi

asp.net - 使用 HtmlTextWriter 呈现服务器控件?

转载 作者:行者123 更新时间:2023-12-04 16:42:00 24 4
gpt4 key购买 nike

我正在写 RenderContents()我的 ASP.NET 服务器控件的方法。该方法使用 HtmlTextWriter对象来呈现输出内容。对于我正在编写的控件,使用 HtmlTextWriter的方法似乎需要很多代码行来打开和关闭每个标签并将每个属性添加到流中。最后,我觉得我最终会得到比它需要的更长的代码。

我在想,如果我使用可链接的类,例如 StringBuilder ,我的代码读起来会更干净,写起来也更容易。

我想知道的是,有什么理由使用 HtmlTextWriter对象来呈现我的整个控件的内容?除了安全检查(我假设)之外,它还包括确保您不会以错误的顺序编写标签或创建无效标记,我看不出任何原因。

似乎只做这样的事情会更容易:

protected override void RenderContents(HtmlTextWriter output)
{
StringBuilder s = new StringBuilder();
s.Append("lots")
.Append("of")
.Append("strings");

output.BeginRender();
output.Write(s.ToString());
output.EndRender();
}

有什么理由说明这是一个坏主意吗?

更新
回复 Mehrdad Afshari的回答:
我没有过多考虑拥有一个单独的 StringBuilder 的内存要求。实例化的对象。为 HtmlTextWriter 制作一个包装器怎么样,这样它就可以被链接起来,这样就不会产生额外的字符串。
public class ChainedHtmlTextWriter
{
private HtmlTextWriter _W;
public ChainedHtmlTextWriter(HtmlTextWriter writer)
{
_W = writer;
}

public ChainedHtmlTextWriter Write<T>(T value)
{
_W.Write(value);
return this;
}

public ChainedHtmlTextWriter WriteLine<T>(T value)
{
_W.WriteLine(value);
return this;
}
}

最佳答案

我在开发一个应用程序,开发人员遵循您正在探索的可怕路径。这让人回想起您必须编写自己的 ISAPI dll 来输出 html 代码的日子。工作总是让人头疼。如果您的代码主要是字符串,那么就有问题了。

我更改的大多数这种类型的代码都会实例化服务器对象,根据需要配置它们的属性,然后将它们告诉 .RenderControl(writer)。这使代码更易于阅读和使用。如果这带来的开销对性能造成影响,我愿意接受(事实上,在我进行更改后,应用程序通常运行得更快,所以有趣的是,情况并非如此,但我没有分析我的代码)。

在字符串中硬编码您的内容的一个简单缺点是 HTML 标准发生变化时。我工作的代码是在 04/05 编写的,从那时起
变成了
并且大写的 html 标签不再是 kosher 了,等等。如果他们一直在使用服务器控件,那些服务器控件已经改变了他们的输出 html 而我们不需要做任何事情。这只是一个简单的例子。

编辑:哦,顺便说一句,BeginRender 和 EndRender 没有任何实现。它们是您在 HtmlTextWriter 派生类中覆盖和提供自定义功能的占位符。

EDIT2:有时总是使用服务器控件有点麻烦,比如容器和东西。我会做很多 .Controls.Add() ,然后再渲染容器。所以有时我会这样做:

writer.AddAttribute(HtmlTextWriterAttribute.Class, "myContainerClass");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
// do some stuff, .RenderControl on some other controls, etc.
writer.RenderEndTag();

如前所述,即使 div 的 html 将来发生变化,这也会呈现正确的 html,因为我没有任何硬编码的字符串。

关于asp.net - 使用 HtmlTextWriter 呈现服务器控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/489691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com