2012-04-17 93 views
3

自闭标签这是我如何创建我的复选框:HTML敏捷性包剥离从输入

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" /> 

它加入到使用敏捷性包这样的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添加到页面时,它看起来像迷失了方向。

我该如何预防?

+0

哪个W3C验证失败?你期待XHTML输出吗? HTML是否支持自闭标签? – sisve 2012-04-17 09:28:14

+0

我们的需求是用于XHTML 1.1的验证 - 我们得到这个错误:'输入的结束标记被省略,但是OMITTAG NO被指定 - 您可能忽略了关闭一个元素,或者您可能意图“自我关闭”一个元素,即以“/>”而不是“>”结尾。 ' – Jon 2012-04-17 09:30:26

+0

您是使用WriteTo(TextWriter)还是WriteTo(XmlWriter)?你有没有设置doc.OptionOutputAsXml? – sisve 2012-04-17 15:53:41

回答

3

最后,我很痛苦地说我退步了用正则表达式处理HTML以添加mising自闭标记。我喜欢一个更好的解决办法,因为这是哈克,而不是面向未来 - 它被添加在需要修正每个标签:

sXHTML = Regex.Replace(sXHTML, "<input(.*?)>", "<input $1 />"); 
10

尝试设置 “OptionWriteEmptyNodes” 标志:

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

// .... 

UPDATE

因为我原来的答案被拒绝后,这里的另一个可能的解决方案。

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

+0

这已经设置为true,不能这样。 =/ – Jon 2012-04-17 09:27:01

+0

我已经更新了我的答案。 – volpav 2012-04-17 09:39:44

+0

是的,文档类型是正确的。我们不通过Agility Pack添加它。 Agility Pack仅用于操纵部分HTML。 – Jon 2012-04-17 09:43:58

2

这包括当您创建文档节点,它应该解决您的问题:

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

原来的答复: Image tag not closing with HTMLAgilityPack

1

你有没有试图忽略agiliy包的节点?例如,该行会告诉html敏捷包忽略更改此节点。

HtmlNode.ElementsFlags.Remove("meta");