HTML Agility Pack supprimant les balises à fermeture automatique de l'entrée

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

Question

Voici comment je crée ma case à cocher:

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

RenderToString est une extension qui fait ceci:

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

Cela produit une chaîne avec une balise de fermeture sur l'entrée, ce que je peux voir lors du débogage.

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

Il est ensuite ajouté au code HTML à l'aide du pack Agility en tant que tel:

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

Toutefois, dans le code HTML, la balise de fermeture automatique manque pour la balise d'entrée de la case à cocher et échoue donc à la validation de WC3.

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

Cela se produit avec mes zones de texte qui sont générées de la même manière. il semble qu'ils se perdent lors de l'ajout du code HTML à la page à l'aide du pack d'agilité.

Comment puis-je empêcher cela?

Réponse acceptée

En fin de compte, cela me fait de la peine de dire que je me suis rabattu sur le traitement du code HTML avec regex pour ajouter la balise à fermeture automatique. J'adorerais une meilleure solution, car il s'agit d'un hacky et non d'une preuve pour l'avenir. Elle doit être ajoutée à chaque balise à corriger:

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

Réponse populaire

Essayez de définir l’option "OptionWriteEmptyNodes":

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

// ....

METTRE À JOUR

Depuis que ma réponse initiale a été rejetée, voici une autre solution possible.

Passez-vous le DOCTYPE correct à votre document HTML avant de le rendre? Jetez un oeil à cette question SO pour savoir comment insérer un DOCTYPE: Ajouter un doctype au HTML via HTML Agility



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi