0

在 MVC4 应用程序中,我将视图模型传递给控制器​​操作方法 AsyncUpdateOrderLine:

function updateQuantity(sender) {
        ...
        var model = @Html.OrderToJson(Model)

        $.ajax({ type: "POST",
            url: "/Order/AsyncUpdateOrderLine",
            datatype: "json",
            contentType: 'application/json',
            data: JSON.stringify({ orderLineId: orderLineId, quantity: quantity, myOrder: model }),
            success: function (msg) {
                ...
            }
        });
    }

当我在运行时检查 myOrder 参数时,我注意到我的模型的 DateTime 属性(例如 OrderDate)没有正确反序列化:1/1/0001。反序列化模型中的其他属性看起来不错。我的 OrderToJson 方法如下所示:

public static MvcHtmlString OrderToJson(this HtmlHelper html, MyViewModel viewModel)
{
    var json = new JavaScriptSerializer().Serialize(viewModel);
    return MvcHtmlString.Create(json);
}

我已经尝试将 DateTime 属性的种类设置为 Utc,但这对我没有任何作用。我还制作了一个小型控制台应用程序来测试序列化和反序列化 DateTime 属性。不用说,在那个示例应用程序中没有问题。这可能与 MVC 反序列化 JSON 字符串的方式有关。有什么技巧可以解决这个问题吗?

问候,尼尔斯

4

2 回答 2

1

尝试使用 Json.NET 序列化程序在 javascript 端获得更好的输出: @Html.Raw(JsonConvert.SerializeObject(Model))

检查客户端上的语言环境。如何解析日期?作为字符串?作为 js 日期对象?

于 2013-06-04T12:22:21.167 回答
0

MVC 内部使用DataContractJsonSerializer. 问题可能是两者都以不同的方式序列化/反序列化日期。

您可以尝试JavascriptSerializer用 DataContractSerializer 替换:

public static MvcHtmlString OrderToJson(this HtmlHelper html, MyViewModel viewModel)
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(MyViewModel));
    string json = string.Empty;
    using (MemoryStream stream = new MemoryStream())
    {
       serializer.WriteObject(stream, viewModel);
       json = Encoding.Default.GetString(stream.ToArray());
    }

    return MvcHtmlString.Create(json);
}
于 2013-06-04T10:27:34.400 回答