MVC3 JsonResult和JsonValueProviderFactory之间的JSON/DateTime行为不一致?
我最近将我的一个项目从MVC2升级到MVC3,并相应地调整了一些代码。我遇到的一个问题是JSON和日期时间问题 我有一个非常简单的代码要演示,这个想法非常简单,我从控制器返回JSON,客户端JavaScript按原样接收,然后发回另一个操作方法来比较数据 用作数据容器的我的视图模型是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
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 + '\\'; });
它应该像一个符咒一样工作。我得到了一个答案,这个答案对我来说非常有用