So erstelle ich meine Checkbox:
HtmlInputCheckBox checkbox = new HtmlInputCheckBox();
checkbox.ID = _Data.ControlID;
checkbox.Attributes.Add("class", "checkbox");
checkbox.Attributes.Add("autocomplete", "off");
sReplacementString = element.RenderToString();
RenderToString
ist eine Erweiterung, die dies tut:
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();
}
Dies erzeugt eine Zeichenfolge mit einem schließenden Tag auf der Eingabe, ich kann dies beim Debuggen sehen.
<input name="ttWBF_1" type="checkbox" id="ttWBF_1" autocomplete="off" class="checkbox" />
Es wird dann mit dem Agility Pack als solches zum HTML hinzugefügt:
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);
Im HTML-Code fehlt dem Eingabe-Tag für das Kontrollkästchen jedoch der selbstschließende Schrägstrich und die WC3-Validierung schlägt fehl.
<input name="ttWBF_1" type="checkbox" id="ttWBF_1" autocomplete="off" class="checkbox">
Dies geschieht mit meinen Textboxen, die auf die gleiche Weise generiert werden. Es sieht so aus, als würden sie verloren gehen, wenn Sie den HTML-Code mithilfe des Agility Packs zur Seite hinzufügen.
Wie verhindere ich das?
Am Ende schmerzt es mich zu sagen, dass ich auf die Verarbeitung des HTML mit Regex zurückgegriffen habe, um in das sich verendeende selbstschließende Tag einzufügen. Ich würde eine bessere Lösung lieben, da dies hacky und nicht zukunftssicher ist - es muss für jedes Tag, das korrigiert werden muss, hinzugefügt werden:
sXHTML = Regex.Replace(sXHTML, "<input(.*?)>", "<input $1 />");
Versuchen Sie, das Flag "OptionWriteEmptyNodes" zu setzen:
HtmlDocument doc = new HtmlDocument();
doc.OptionWriteEmptyNodes = true;
// ....
AKTUALISIEREN
Da meine ursprüngliche Antwort abgelehnt wurde, ist hier eine andere mögliche Lösung.
Übergeben Sie vor dem Rendern den richtigen DOCTYPE an Ihr HTML-Dokument? Werfen Sie einen Blick auf diese SO-Frage, wie Sie einen DOCTYPE einfügen können: Fügen Sie über HTML Agility Pack einen Doctyp zu HTML hinzu