HTML Agility Pack, снятие самозакрывающихся тегов с ввода

.net asp.net c# 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" />

Затем он добавляется в 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.

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

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

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

Принятый ответ

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

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

Популярные ответы

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

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

// ....

ОБНОВИТЬ

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

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



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему