2011-06-14 75 views
1

我最近将我的一个项目从MVC2升级到MVC3,并相应地调整了一些代码。我遇到的一个问题是JSON和DateTime问题。MVC3 JsonResult和JsonValueProviderFactory之间的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中编辑的动作方法应与ReceiveJsonData相同。但实际的行为是整数和字符串值是持久的,但重置值datetime

任何线索为什么?

回答

2

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

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

4

或者你可以做这样的事情:

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

,它应该工作就像一个魅力。

+1

优秀!!!那工作 – 2013-05-26 07:47:07

+0

**伟大的工作。 !** – Sender 2015-08-07 07:03:17

相关问题