6

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

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 添加到页面时迷路了。

我该如何防止这种情况?

4

4 回答 4

15

尝试设置“OptionWriteEmptyNodes”标志:

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

// ....

更新

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

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

于 2012-04-17T09:23:20.107 回答
3

最后,让我痛苦的是,我重新使用正则表达式处理 HTML 以添加丢失的自闭合标签。我想要一个更好的解决方案,因为这是 hacky 而不是未来的证明 - 必须为每个需要更正的标签添加它:

sXHTML = Regex.Replace(sXHTML, "<input(.*?)>", "<input $1 />");
于 2012-05-02T15:54:33.227 回答
2

在创建文档节点时包含此内容,它应该可以解决您的问题:

if (HtmlNode.ElementsFlags.ContainsKey("input"))
{   HtmlNode.ElementsFlags["input"] = HtmlElementFlag.Closed;}
else
{   HtmlNode.ElementsFlags.Add("input", HtmlElementFlag.Closed);}

原始答案: 图像标签未使用 HTMLAgilityPack 关闭

于 2012-08-23T18:11:58.773 回答
2

您是否尝试忽略敏捷包中的节点?例如,这一行将告诉 html 敏捷包忽略更改此节点。

  HtmlNode.ElementsFlags.Remove("meta");
于 2016-05-19T13:54:57.213 回答