【问题标题】:MVC3 Inconsistent JSON/DateTime Behaviour between JsonResult and JsonValueProviderFactory?JsonResult 和 JsonValueProviderFactory 之间的 MVC3 JSON/DateTime 行为不一致?
【发布时间】:2011-06-14 23:44:46
【问题描述】:

我最近将我的一个项目从 MVC2 升级到 MVC3 并相应地调整了一些代码。我遇到的一个问题是 JSON 和 DateTime 问题。

我有一个非常简单的代码来演示,这个想法非常简单,我从控制器返回 JSON,客户端 JavaScript 按原样接收并回传到另一个动作方法来比较数据。

我用作数据容器的视图模型是

public class JsonViewModel {
    public int IntegerValue {
        get;
        set;
    }

    public string StringValue {
        get;
        set;
    }

    public DateTime DateTimeValue {
        get;
        set;
    }
}

我有一个控制器,它有 2 种操作方法,一种用于生成 JSON 数据,一种用于接收 JSON 数据:

public class HomeController : Controller {
    [HttpPost]
    public JsonResult GetJsonData() {
        JsonViewModel data = new JsonViewModel
        {
            IntegerValue = 99,
            StringValue = "This is test string",
            DateTimeValue = DateTime.Now
        };

        return new JsonResult { ContentEncoding = Encoding.UTF8, Data = data };
    }

    [HttpPost]
    public ActionResult ReceiveJsonData(JsonViewModel data) {
        return View(data);
    }
}

视图代码也很简单,

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<SomeClass>" %>
<!DOCTYPE html>
<html>
<head runat="server">
<link type="text/css" href="<%: Url.Content("~/Content/site1.css") %>" rel="stylesheet" />
<link type="text/css" href="<%: Url.Content("~/Content/themes/base/jquery.ui.all.css") %>" rel="stylesheet" />
<script type="text/javascript" src="<%: Url.Content("~/Scripts/jquery-1.5.1.js") %>"></script>
<script type="text/javascript" src="<%: Url.Content("~/Scripts/jquery.validate.js") %>"></script>
<script type="text/javascript" src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.js") %>"></script>
<script type="text/javascript" src="<%: Url.Content("~/Scripts/jquery-ui-1.8.11.js") %>"></script>
</head>
<body>
<input type="button" value="JSON Test" id="btnJson" />
<script>
    $(document).ready(function () {
        $('#btnJson').click(function () {
            $.ajax({
                type: "Post",
                url: "/Home/GetJsonData/",
                dataType: "json",
                error: function (request, error) {
                    alert("readyState: " + request.readyState + "\nstatus: " + request.status);
                    alert("responseText: " + request.responseText);
                },
                success: function (data) {
                    var jsonData = JSON.stringify(data);
                    $.ajax({
                        type: "POST",
                        contentType: "application/json; charset=utf-8",
                        url: "/Home/ReceiveJsonData/",
                        cache: false,
                        data: jsonData,
                        dataType: "html",
                        success: function (result) {
                            //alert(result);
                        },
                        error: function (request) {
                            alert("readyState: " + request.readyState + "\nstatus: " + request.status);
                            alert("responseText: " + request.responseText);
                        }
                    });
                }
            });
        });
    });
</script>
</body>
</html>

我期望在GetJsonData 操作方法中生成和searilzed 的对象应该与ReceiveJsonData 操作方法相同。但实际行为是整数和字符串值被持久化,但datetime 值被重置。

有什么线索吗?

【问题讨论】:

    标签: json asp.net-mvc-3


    【解决方案1】:

    或者你可以这样做:

    var jsonData = JSON.stringify(data).replace(/\/Date\(\d+\)/g, function (a) { return '\\' + a + '\\'; });
    

    它应该像一个魅力。

    【讨论】:

      【解决方案2】:

      我也有同样的问题。在测试期间,我意识到 JSON.stringify 从“\/Date(xxxxx)\/”中删除了“\”,而 MVC 无法反序列化它。解决方案是强制执行不同类型的 DateTime 序列化。而不是返回 JsonResult 我做这样的事情: var json = JsonConvert.ExportToString(data); return Content(json,"application/json");

      JsonConvert 是一个 Jayrock 库类。它以 MVC 可以理解的 XML 格式存储 DateTime 值。希望有帮助

      【讨论】:

        【解决方案3】:

        我从http://forums.asp.net/t/1689952.aspx/1 得到了答案,这对我来说非常有效。

        【讨论】:

          猜你喜欢
          • 2021-07-19
          • 2014-08-31
          • 1970-01-01
          • 1970-01-01
          • 2016-11-09
          • 1970-01-01
          • 2014-11-13
          • 2017-12-21
          • 1970-01-01
          相关资源
          最近更新 更多