Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MVC3 JsonResult和JsonValueProviderFactory之间的JSON/DateTime行为不一致?_Json_Asp.net Mvc 3 - Fatal编程技术网

MVC3 JsonResult和JsonValueProviderFactory之间的JSON/DateTime行为不一致?

MVC3 JsonResult和JsonValueProviderFactory之间的JSON/DateTime行为不一致?,json,asp.net-mvc-3,Json,Asp.net Mvc 3,我最近将我的一个项目从MVC2升级到MVC3,并相应地调整了一些代码。我遇到的一个问题是JSON和日期时间问题 我有一个非常简单的代码要演示,这个想法非常简单,我从控制器返回JSON,客户端JavaScript按原样接收,然后发回另一个操作方法来比较数据 用作数据容器的我的视图模型是 public class JsonViewModel { public int IntegerValue { get; set; } public stri

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

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

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

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

    public string StringValue {
        get;
        set;
    }

    public DateTime DateTimeValue {
        get;
        set;
    }
}
我有一个控制器,它有两个操作方法,一个用于生成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>

$(文档).ready(函数(){
$('#btnJson')。单击(函数(){
$.ajax({
类型:“Post”,
url:“/Home/GetJsonData/”,
数据类型:“json”,
错误:函数(请求、错误){
警报(“readyState:+request.readyState+”\n状态:+request.status);
警报(“responseText:+request.responseText”);
},
成功:功能(数据){
var jsonData=JSON.stringify(数据);
$.ajax({
类型:“POST”,
contentType:“应用程序/json;字符集=utf-8”,
url:“/Home/ReceiveJsonData/”,
cache:false,
资料来源:jsonData,
数据类型:“html”,
成功:功能(结果){
//警报(结果);
},
错误:函数(请求){
警报(“readyState:+request.readyState+”\n状态:+request.status);
警报(“responseText:+request.responseText”);
}
});
}
});
});
});
我所期望的是,在
GetJsonData
操作方法中生成和解析的对象应该与
ReceiveJsonData
操作方法相同。但实际行为是保留整数和字符串值,但重置
datetime


有什么线索吗?

我也有同样的问题。在测试期间,我意识到JSON.stringify从“\/Date(xxxxx)\/”中删除“\”,而MVC无法对其进行反序列化。解决方案是强制实施不同类型的日期时间序列化。我不返回JsonResult,而是执行以下操作:
var json=JsonConvert.ExportToString(数据);返回内容(json,“应用程序/json”)


JsonConvert是一个Jayrock库类。它以XML格式存储日期时间值,这对于MVC来说是可以理解的。希望这对你有所帮助,或者你可以这样做:

var jsonData = JSON.stringify(data).replace(/\/Date\(\d+\)/g, function (a) { return '\\' + a + '\\'; });
它应该像一个符咒一样工作。

我得到了一个答案,这个答案对我来说非常有用