Paquete de agilidad HTML que elimina las etiquetas de cierre automático de la entrada

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

Pregunta

Así es como estoy creando mi casilla de verificación:

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

RenderToString es una extensión que hace esto:

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

Esto produce una cadena con una etiqueta de cierre en la entrada, puedo ver esto al depurar.

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

Luego se agrega al HTML usando el paquete Agility como tal:

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

Sin embargo, en el HTML, la etiqueta de entrada para la casilla de verificación falta su barra de cierre automático y, por lo tanto, falla la validación de WC3.

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

Esto sucede con mis cuadros de texto que se generan de la misma manera. parece que se están perdiendo al agregar el HTML a la página usando el paquete de agilidad.

¿Cómo puedo prevenir esto?

Respuesta aceptada

Al final me duele decir que me repliqué en el procesamiento del HTML con expresiones regulares para agregar la etiqueta de cierre automático. Me encantaría una solución mejor, ya que esto es intrépido y no es una prueba de futuro; debe agregarse para cada etiqueta que deba corregirse:

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

Respuesta popular

Intente establecer el indicador "OptionWriteEmptyNodes":

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

// ....

ACTUALIZAR

Desde que mi respuesta original fue rechazada, aquí hay otra posible solución.

¿Está pasando el DOCTYPE correcto a su documento HTML antes de representarlo? Eche un vistazo a esta pregunta SO para saber cómo insertar un DOCTYPE: agregue un doctype a HTML a través de HTML Agility Pack



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué