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对象,但如果你不需要它,你可以使用“vanilia”JavaScriptSerializer来代替。

于 2012-10-31T15:53:49.417 回答