我们知道MVC以这种格式返回JsonResult的DateTime:/ Date(1240718400000)/,我们知道如何在JS中解析它.
但是,似乎MVC不接受以这种方式发送的DateTime参数.例如,我有以下操作.
[HttpGet] public ViewResult Detail(BookDetail details) { //... }
BookDetail类包含一个名为CreateDate的DateTime字段,我以这种格式从JS传递了一个JSON对象:
{"CreateDate": "/Date(1319144453250)/"}
CreateDate被识别为null.
如果我以这种方式传递JSON,它的工作原理如下:
{"CreateDate": "2011-10-10"}
问题是我不能以简单的方式改变客户端代码,必须坚持/ Date(1319144453250)/这种格式.我必须在服务器端进行更改.
如何解决这个问题?这与ModelBinder有什么关系吗?
非常感谢!
解决方法
您怀疑的问题是模型绑定问题.
要解决它,创建一个自定义类型,让我们称之为JsonDateTime.因为DateTime是一个结构体,你不能继承它,所以创建下面的类:
public class JsonDateTime { public JsonDateTime(DateTime dateTime) { _dateTime = dateTime; } private DateTime _dateTime; public DateTime Value { get { return _dateTime; } set { _dateTime = value; } } }
将CreateDate更改为此类型.接下来,我们需要一个自定义模型binder,如下所示:
public class JsonDateTimeModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext) { var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).ToString(); return new DateTime(Int64.Parse( value.Substring(6).Replace(")/",String.Empty))); // "borrowed" from skolima's answer } }
然后,在Global.asax.cs中,在Application_Start中,注册您的自定义ModelBinder:
ModelBinders.Binders.Add(typeof(JsonDateTime),new JsonDateTimeModelBinder());