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(); } 

Это создает строку с закрывающим тегом на входе, я вижу это при отладке.

  

Затем он добавляется в HTML с помощью пакета Agility Pack:

 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.

  

Это происходит с моими текстовыми полями, которые генерируются таким же образом. похоже, что они теряются при добавлении HTML на страницу с помощью пакета agility.

Как я могу это предотвратить?

Попробуйте установить флаг «OptionWriteEmptyNodes»:

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

ОБНОВИТЬ

Поскольку мой первоначальный ответ был отклонен, вот еще одно возможное решение.

Передаете ли вы правильный DOCTYPE в свой HTML-документ перед его рендерингом? Взгляните на этот SO-вопрос о том, как вставить DOCTYPE: добавьте doctype в HTML через HTML Agility pack

В конце концов мне больно сказать, что я снова вернулся к обработке HTML с регулярным выражением, чтобы добавить в тег самозакрывающегося тега. Я хотел бы получить лучшее решение, поскольку это хакерское, а не будущее доказательство – оно должно быть добавлено для каждого тега, который нуждается в исправлении:

 sXHTML = Regex.Replace(sXHTML, "", ""); 

Включите это, когда вы создаете свой узел документа, и он должен решить вашу проблему:

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

Оригинальный ответ: тег изображения не закрывается с помощью HTMLAgilityPack

Вы пытались игнорировать узел из пакета agiliy? Например, эта строка сообщит html agility pack, чтобы игнорировать изменение этих узлов.

  HtmlNode.ElementsFlags.Remove("meta");