c# - HTML Agility Pack 从输入中剥离自闭合标签

标签 c# asp.net .net html-agility-pack

这就是我创建复选框的方式:

HtmlInputCheckBox checkbox = new HtmlInputCheckBox();
checkbox.ID = _Data.ControlID;
checkbox.Attributes.Add("class", "checkbox");
checkbox.Attributes.Add("autocomplete", "off");
sReplacementString = element.RenderToString();

RenderToString 是执行此操作的扩展:

public static string RenderToString(this Control control)
{
    StringBuilder sb = new StringBuilder();
    using (StringWriter writer = new StringWriter(sb))
    {
        using (HtmlTextWriter htmlWriter = new HtmlTextWriter(writer))
        {
            control.RenderControl(htmlWriter);
        }
    }
    return sb.ToString();
}

这会在输入上生成一个带有结束标记的字符串,我可以在调试时看到它。

<input name="ttWBF_1" type="checkbox" id="ttWBF_1" autocomplete="off" class="checkbox" />

然后使用 Agility Pack 将其添加到 HTML 中:

HtmlNode temp = doc.CreateElement("temp");
temp.InnerHtml = sReplacementString;
HtmlNode current = inputNode;

foreach (HtmlNode child in temp.ChildNodes)
{
    inputNode.ParentNode.InsertAfter(child, current);
    current = child;
}
inputNode.ParentNode.RemoveChild(inputNode);

但是在 HTML 中,复选框的输入标记缺少其自闭合斜杠,因此无法通过 WC3 验证。

<input name="ttWBF_1" type="checkbox" id="ttWBF_1" autocomplete="off" class="checkbox">

我的文本框会发生这种情况,它们以相同的方式生成。使用敏捷包将 HTML 添加到页面时,他们似乎迷路了。

如何防止这种情况?

最佳答案

尝试设置“OptionWriteEmptyNodes”标志:

HtmlDocument doc = new HtmlDocument();
doc.OptionWriteEmptyNodes = true;

// ....

更新

由于我的原始答案被拒绝,这里有另一种可能的解决方案。

您是否在呈现之前将正确的 DOCTYPE 传递给您的 HTML 文档?看看这个关于如何插入 DOCTYPE 的问题:Add a doctype to HTML via HTML Agility pack

关于c# - HTML Agility Pack 从输入中剥离自闭合标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10188285/

相关文章:

c# - 使用 ASP.NET 反序列化复杂的 JSON 对象?

c# - 将 WebResponse 另存为 txt

.net - TeamCity - MSBuild 运行程序退出时代码不为零

c# - WebOperationContext.Current.OutgoingResponse.StatusCode 不起作用

c# - 使用 AppDomains 并行化非线程安全 DLL

c# - 如何使用Unity根据http请求参数将服务动态注入(inject)asp.net web api Controller

c# - 如何使用显示图像的处理程序检查图像控件中是否存在图像

.net - 在 .net 网络应用程序中发布 rdlc 文件?

.net - 如何国际化来自数据库的数据?

c# - 为什么 Int32.MaxValue = 2147483648?