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:

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

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

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

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

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

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.

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

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