6

これは、チェックボックスを作成する方法です。

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

RenderToStringこれを行う拡張機能です:

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

これにより、入力に終了タグが付いた文字列が生成されます。デバッグ時にこれを確認できます。

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

次に、Agility Pack を使用して HTML に追加します。

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

ただし、HTML では、チェックボックスの入力タグに自己終了スラッシュがないため、WC3 検証に失敗します。

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

これは、同じ方法で生成されたテキスト ボックスで発生します。アジリティ パックを使用して HTML をページに追加するときに、それらが失われているようです。

これを防ぐにはどうすればよいですか?

4

4 に答える 4

15

「OptionWriteEmptyNodes」フラグを設定してみてください。

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

// ....

アップデート

私の元の回答が拒否されたため、別の可能な解決策があります。

HTML ドキュメントをレンダリングする前に、正しい DOCTYPE を HTML ドキュメントに渡していますか? DOCTYPE を挿入する方法については、この SO の質問をご覧ください: Add a doctype to HTML via HTML Agility pack

于 2012-04-17T09:23:20.107 に答える
3

結局、正規表現を使用してHTMLを処理し、欠落している自己終了タグを追加することに頼ったと言うのは辛いことです。これはハッキーであり、将来を保証するものではないため、より良いソリューションが必要です。修正が必要なすべてのタグに追加する必要があります。

sXHTML = Regex.Replace(sXHTML, "<input(.*?)>", "<input $1 />");
于 2012-05-02T15:54:33.227 に答える
2

Agiliy Pack からノードを無視しようとしましたか? たとえば、この行は、このノードの変更を無視するように html アジリティ パックに指示します。

  HtmlNode.ElementsFlags.Remove("meta");
于 2016-05-19T13:54:57.213 に答える
2

ドキュメントノードを作成するときにこれを含めると、問題が解決するはずです。

if (HtmlNode.ElementsFlags.ContainsKey("input"))
{   HtmlNode.ElementsFlags["input"] = HtmlElementFlag.Closed;}
else
{   HtmlNode.ElementsFlags.Add("input", HtmlElementFlag.Closed);}

元の回答: HTMLAgilityPack で画像タグが閉じない

于 2012-08-23T18:11:58.773 に答える