2

序文: これは、次の質問の派生的な質問です。

  1. Mvc モデルを KnockoutJS に渡す際のベスト プラクティス
  2. ASP.NET MVC 3 "Razor" ビュー エンジンを使用して KnockoutJS でデータ バインディングを有効にする方法は?

MVC ビュー モデルを KnockoutJS に渡すとき、次の構文を使用することに慣れていました。

var initialData = @Html.Raw(Json.Encode(Model));

しかし最近、人々が次の構文を使用しているのを見てきました:

var initialData = @Html.Raw( new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model));

私の質問:

  • System.Web.Script.Serialization.JavaScriptSerializer().SerializeないことをJson.Encodeしますか?
4

1 に答える 1

5

それは逆です:Json.Encode(Model)プレーンよりも多くのことをしますJavaScriptSerializer

内部的にJson.Encodeも を使用しますSystem.Web.Script.Serialization.JavaScriptSerializerが、 と呼ばれる追加のコンバーターを登録しDynamicJavaScriptConverterます。

はどこDynamicJavaScriptConverterですか

動的オブジェクトからメンバー値を取得する方法を知っているコンバーター。

Json.Encode ソースをオンラインで確認できます:

public static class Json
{
    private static readonly JavaScriptSerializer _serializer = CreateSerializer();

    public static string Encode(object value)
    {
        // Serialize our dynamic array type as an array
        DynamicJsonArray jsonArray = value as DynamicJsonArray;
        if (jsonArray != null)
        {
            return _serializer.Serialize((object[])jsonArray);
        }

        return _serializer.Serialize(value);
    }       

    private static JavaScriptSerializer CreateSerializer()
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        serializer.RegisterConverters(new[] { new DynamicJavaScriptConverter() });
        return serializer;
    }

    //...
}

を使用すると、オブジェクトJson.Encodeを処理するための追加のサポートが得られdynamicますが、それが必要ない場合は、JavaScriptSerializer代わりに「vanilia」を使用できます。

于 2012-10-31T15:53:49.417 に答える