69

MSDNにあるこの情報のために、MvcHtmlStringインスタンスを連結する方法について疑問があります。

MvcHtmlStringクラス再度エンコードされるべきではないHTMLエンコードされた文字列を表します

次のようなコードを使用すると、文字列が2回HTMLエンコードされるリスクがありますか?

var label = Html.LabelFor(model => model.Email);
var textbox = Html.TextBoxFor(model => model.Email);
var validation = Html.ValidationMessageFor(model => model.Email);

var result = MvcHtmlString.Create(
  label.ToString() + textbox.ToString() + validation.ToString());

(注:これは、ビューでのコードの重複を減らすためにHtmlHelper拡張メソッドに組み込まれることになっています)。

4

4 に答える 4

60

あまりにも悪いC#では、ここで+演算子をオーバーライドできません!代わりに拡張メソッドを使用するのはどうですか?

public static MvcHtmlString Concat(this MvcHtmlString first, params MvcHtmlString[] strings)
{
    return MvcHtmlString.Create(first.ToString() + string.Concat(strings.Select(s => s.ToString())));
}

これはおそらく最適化できますが、それを使用して実行できます。これが単体テストで文字列を二重エンコードしないことを証明するのはかなり簡単なはずです。

使用例:

label.Concat(textbox, validation)   

そして今、私のブログの恥知らずなプラグイン:TagBuilderまたはHtmlTagsを使用してHTMLをクリーンアップします

于 2010-08-12T03:52:50.873 に答える
28

あなたのコードは正しいです。

MSDNのスニペットは、エンコードビューエンジン(使用時の.NET4のAspxビューエンジン<%: %>やMVC3のRazorビューエンジンなど)がオブジェクトの文字列値を再エンコードしてはならないことを意味します。

したがって、たとえば:

string s = "<tag>";
var hs = MvcHtmlString.Create(s);

<%: s %>  -- outputs "&lt;tag&gt;"
<%: hs %> -- outputs "<tag>"
于 2010-08-11T18:22:00.717 に答える
21

私はこのアプローチに行きました:

    private static MvcHtmlString Concat(params MvcHtmlString[] items)
    {
        var sb = new StringBuilder();
        foreach (var item in items.Where(i => i != null))
            sb.Append(item.ToHtmlString());
        return MvcHtmlString.Create(sb.ToString());
    }

これは、HtmlHelperの拡張メソッドを持つクラス内で使用するユーティリティメソッドにすぎません。

于 2010-12-05T17:06:48.447 に答える
4

私はこれが非常に古いことを知っていますが、さらに別の方法(私はよりエレガントであることがわかります)は、メタデータ定義であるStringメソッドConcatのオーバーロードを使用することです

public static String Concat(params object[] args);

これは基本的に、渡された各オブジェクトをToStringsし、結果を連結して、連結された文字列を返します。

したがって、最終的な結果は次のようになります。

var result = MvcHtmlString.Create(
    string.Concat(
        label, textbox, validation
    )
);
于 2018-01-05T21:26:58.543 に答える