除了备用设备的自适应渲染之外,编写所有这些代码是否有意义:
writer.WriteBeginTag("table");
writer.WriteBeginTag("tr");
writer.WriteBeginTag("td");
writer.Write(HtmlTextWriter.TagRightChar);
writer.WriteEncodedText(someTextVariable);
writer.WriteEndTag("td");
writer.WriteEndTag("tr");
writer.WriteEndTag("table");
Run Code Online (Sandbox Code Playgroud)
当StringBuilder可以简单地构建相同的东西时:
sb.Append("<table><tr><td>");
sb.Append(someTextVariable);
sb.Append("</td></tr></table>");
Run Code Online (Sandbox Code Playgroud) 我想将href属性添加到link元素.这是我的代码:
System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
using (System.IO.StringWriter stringWriter = new System.IO.StringWriter(stringBuilder))
{
using (System.Web.UI.HtmlTextWriter htmlTextWriter = new System.Web.UI.HtmlTextWriter(stringWriter))
{
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Ul);
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Li);
htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.A);
htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Href, "http://www.google.de");
htmlTextWriter.Write("Google");
htmlTextWriter.RenderEndTag();
htmlTextWriter.RenderEndTag();
htmlTextWriter.RenderEndTag();
}
}
Run Code Online (Sandbox Code Playgroud)
它呈现为:
<ul>
<li><a>Google</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)
这是我的预期.
<ul>
<li><a href="http://www.google.de">Google</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)
出了什么问题,我该如何解决这个问题?
请不要回答我可以用其他方式组装字符串.我想知道如何使用HtmlTextWriter实现这一目标
我在类文件中创建一个CheckBoxList,并使用HTMLTextWriter来呈现控件.
我正在使用以下代码将所选值存储在字符串中:
string YrStr = "";
for (int i = 0; i < YrChkBox.Items.Count; i++)
{
if (YrChkBox.Items[i].Selected)
{
YrStr += YrChkBox.Items[i].Value + ";";
}
}
Run Code Online (Sandbox Code Playgroud)
我逐步完成了代码,它似乎没有触及if语句的内部,并且每次选中的value属性都是false ...任何人都知道如何解决这个问题?
我使用以下内容填充它:
YrChkBox.Items.Add(new ListItem("Item 1", "Item1"));
Run Code Online (Sandbox Code Playgroud) 在我看来,使用HtmlTextWriter渲染HTML并不是非常直观,但如果您在Web表单中实现Web控件,那么您必须使用它.我认为有可能为此创建一个流畅的界面,它更像是它输出的HTML.我想知道人们对我到目前为止提出的语法的看法.
public void Render(HtmlTextWriter writer)
{
writer
.Tag(HtmlTextWriterTag.Div, e => e[HtmlTextWriterAttribute.Id, "id"][HtmlTextWriterAttribute.Name,"name"][HtmlTextWriterAttribute.Class,"class"])
.Tag(HtmlTextWriterTag.Span)
.Text("Lorem")
.EndTag()
.Tag(HtmlTextWriterTag.Span)
.Text("ipsum")
.EndTag()
.EndTag();
}
Run Code Online (Sandbox Code Playgroud)
"Tag","Text"和"EndTag"是HtmlTextWriter类的扩展方法,它返回它所接受的实例,以便可以链接调用.传递给第一次调用"Tag"时使用的重载中使用的lambda的参数是一个"HtmlAttributeManager",它是一个简单的类,它包装一个HtmlTextWriter来提供一个索引器,它接受一个HtmlTextWriterAttribute和一个字符串值并返回实例所以这些电话可以被链接.我也有这个类的方法用于最常见的属性,例如"Name","Class"和"Id",这样你就可以编写上面的第一个调用,如下所示:
.Tag(HtmlTextWriterTag.Div, e => e.Id("id").Name("name").Class("class"))
Run Code Online (Sandbox Code Playgroud)
一个更长的例子:
public void Render(HtmlTextWriter writer)
{
writer
.Tag(HtmlTextWriterTag.Div, a => a.Class("someClass", "someOtherClass"))
.Tag(HtmlTextWriterTag.H1).Text("Lorem").EndTag()
.Tag(HtmlTextWriterTag.Select, t => t.Id("fooSelect").Name("fooSelect").Class("selectClass"))
.Tag(HtmlTextWriterTag.Option, t => t[HtmlTextWriterAttribute.Value, "1"][HtmlTextWriterAttribute.Title, "Selects the number 1."])
.Text("1")
.EndTag(HtmlTextWriterTag.Option)
.Tag(HtmlTextWriterTag.Option, t => t[HtmlTextWriterAttribute.Value, "2"][HtmlTextWriterAttribute.Title, "Selects the number 2."])
.Text("2")
.EndTag(HtmlTextWriterTag.Option)
.Tag(HtmlTextWriterTag.Option, t => t[HtmlTextWriterAttribute.Value, "3"][HtmlTextWriterAttribute.Title, "Selects the number 3."])
.Text("3")
.EndTag(HtmlTextWriterTag.Option)
.EndTag(HtmlTextWriterTag.Select)
.EndTag(HtmlTextWriterTag.Div);
}
Run Code Online (Sandbox Code Playgroud)
希望你能够"破译"这个片段输出的HTML,至少这个想法.
请给我任何关于如何改进语法的想法,可能是更好的方法名称,也许是其他一些方法. …
我有一个第三方工具,使用HtmlTextWriter的RenderBeginTag,RenderEndTag和AddAttribute方法通过代码创建img标记.我希望将生成的HTML转换为字符串.我尝试了这里提到的反射方法,但是我得到一个错误"无法将类型'System.Web.HttpWriter'的对象强制转换为'System.IO.StringWriter'.HtmlTextWriter的InnerWriter类型是HttpWriter类型.
关于如何将输出html复制到字符串中的任何想法?
增加:来自第三方控件的代码
protected override void Render( HtmlTextWriter output )
{
.....
output.AddAttribute( HtmlTextWriterAttribute.Src, src );
output.RenderBeginTag( HtmlTextWriterTag.Img );
output.RenderEndTag();
<-- What is the HTML now? Maybe look in OnPreRenderComplete event?
}
Run Code Online (Sandbox Code Playgroud) 我正在编写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();
}
Run Code Online (Sandbox Code Playgroud)
有什么理由说这是个坏主意吗?
更新
响应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;
}
}
Run Code Online (Sandbox Code Playgroud) asp.net stringbuilder servercontrols htmltextwriter method-chaining
我正在使用.net并且需要获取一些html文本,所以我想我会一起使用HtmlTextWriter和StringWriter来获得格式正确的html.但是,尽管编写代码的方式各不相同,我仍然会收到静态代码分析器的警告(使用Microsoft All Rules).在下面的代码示例中,我在注释中显示代码分析器警告.为了简化代码,我实际上并没有对HtmlTextWriter进行任何调用(您将在每个函数中看到对该效果的注释).如何正确编写代码以避免警告?
// CA2000 : Microsoft.Reliability : In method 'Default.Func1()', object 'stringWriter' is not disposed along all exception paths. Call System.IDisposable.Dispose on object 'stringWriter' before all references to it are out of scope.
public static string Func1()
{
string html;
StringWriter stringWriter;
using (var writer = new HtmlTextWriter(stringWriter = new StringWriter()))
{
// You would do some stuff with the writer here, but not for this example.
html = stringWriter.ToString();
}
return html;
}
// CA2202 : Microsoft.Usage : …
Run Code Online (Sandbox Code Playgroud) 我想显示一个名为的文本
"welcome<to>Jsp"
Run Code Online (Sandbox Code Playgroud)
在页面源中我也看到"welcomeJsp"
但在HTML中它仅显示为"welcomeJsp".请指导我.
我用来HtmlTextWriter
将 html 输出到流中。但是,我缺少一种编写 html 注释的方法。当然,我可以编写一个扩展方法
public static void WriteComment(this HtmlTextWriter writer, string comment)
{
writer.Write("<!-- ");
writer.WriteEncodedText(comment);
writer.Write(" -->");
}
Run Code Online (Sandbox Code Playgroud)
但这确实感觉有点不优雅——是否有一些我没有看到的内置方法?
使用HtmlTextWriter.WriteBreak方法时,是否可以在br标记中添加类?
writer.AddAttribute(HtmlTextWriterAttribute.Class, "className");
writer.WriteBreak();
Run Code Online (Sandbox Code Playgroud)
我需要一个符合xHtml标准的html输出,因此WriteBreak在编写时非常完美
<br />
Run Code Online (Sandbox Code Playgroud)
我想在br中添加一个类,以便我拥有
<br class="className" />
Run Code Online (Sandbox Code Playgroud) htmltextwriter ×10
c# ×5
.net ×4
asp.net ×4
html ×4
ca2000 ×1
ca2202 ×1
conventions ×1
jsp ×1
render ×1
stream ×1
stringwriter ×1
web-controls ×1