HTML Agility Pack che elimina i tag a chiusura automatica dall'input

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

Domanda

Ecco come sto creando la mia casella di controllo:

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

RenderToString è un'estensione che esegue questo:

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

Questo produce una stringa con un tag di chiusura sull'input, posso vederlo quando si esegue il debug.

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

Viene quindi aggiunto al codice HTML utilizzando il pacchetto Agility in quanto tale:

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

Tuttavia nel codice HTML il tag di input per la casella di controllo manca la sua barra di chiusura automatica e quindi fallisce la convalida di WC3.

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

Questo succede con le mie caselle di testo che vengono generate allo stesso modo. sembra che si stiano perdendo quando aggiungono l'HTML alla pagina usando il pacchetto agility.

Come posso evitare questo?

Risposta accettata

Alla fine mi addolora dire che sono tornato a elaborare l'HTML con regex per aggiungere il tag self-closing. Mi piacerebbe una soluzione migliore in quanto è hacky e non a prova di futuro: deve essere aggiunta per ogni tag che deve essere corretto:

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

Risposta popolare

Prova a impostare il flag "OptionWriteEmptyNodes":

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

// ....

AGGIORNARE

Poiché la mia risposta originale è stata respinta, ecco un'altra possibile soluzione.

Stai passando il DOCTYPE corretto al tuo documento HTML prima di renderlo? Dai un'occhiata a questa domanda SO su come inserire un DOCTYPE: aggiungi un doctype all'HTML tramite il pacchetto Agility HTML



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché