我有一个复杂的JSON对象,它被发送到View没有任何问题(如下所示)但我无法弄清楚如何通过AJAX调用将这些数据序列化回.NET对象.各部分的细节如下.
var ObjectA = { "Name": 1, "Starting": new Date(1221644506800), "Timeline": [ { "StartTime": new Date(1221644506800), "GoesFor": 200 } , { "StartTime": new Date(1221644506800), "GoesFor": 100 } ] };
我不确定如何将此对象传递给Controller方法,我在下面使用此方法,其中Timelines对象使用Properties镜像上述JS对象.
public JsonResult Save(Timelines person)
我使用的jQuery是:
var encoded = $.toJSON(SessionSchedule); $.ajax({ url: "/Timeline/Save", type: "POST", dataType: 'json', data: encoded, contentType: "application/json; charset=utf-8", beforeSend: function() { $("#saveStatus").html("Saving").show(); }, success: function(result) { alert(result.Result); $("#saveStatus").html(result.Result).show(); } });
我已经看到这个问题类似,但不完全相同,因为我没有使用表单来操纵数据. 如何使用json将复杂类型传递给ASP.NET MVC控制器
我也看到过使用'JsonFilter'手动反序列化JSON的引用,但是想知道是否有办法通过ASP.NET MVC进行本地化的操作?或者以这种方式传递数据的最佳做法是什么?
编辑:
MVC 3的到来不再需要这种方法,因为它将自动处理 - http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3 -preview-1.aspx
您可以使用此ObjectFilter:
public class ObjectFilter : ActionFilterAttribute { public string Param { get; set; } public Type RootType { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext) { if ((filterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json")) { object o = new DataContractJsonSerializer(RootType).ReadObject(filterContext.HttpContext.Request.InputStream); filterContext.ActionParameters[Param] = o; } } }
然后,您可以将它应用于您的控制器方法,如下所示:
[ObjectFilter(Param = "postdata", RootType = typeof(ObjectToSerializeTo))] public JsonResult ControllerMethod(ObjectToSerializeTo postdata) { ... }
所以基本上,如果帖子的内容类型是"application/json",这将会生效,并将值映射到您指定的类型的对象.
你说"我没有使用表单来操纵数据." 但你正在做一个POST.因此,实际上,您使用的是表格,即使它是空的.
$ .ajax的dataType告诉jQuery服务器将返回什么类型,而不是你传递的内容.POST只能传递一个表单.jQuery 会将数据转换为键/值对,并将其作为查询字符串传递.来自文档:
要发送到服务器的数据.如果不是字符串,它将转换为查询字符串.它附加到GET请求的URL.请参阅processData选项以防止此自动处理.对象必须是键/值对.如果value是一个数组,则jQuery使用相同的键序列化多个值,即{foo:["bar1","bar2"]}变为'&foo = bar1&foo = bar2'.
因此:
您没有将JSON传递给服务器.你将JSON传递给jQuery.
模型绑定的发生方式与任何其他情况下的相同.
虽然这个问题的答案早就应该解决了,但是我仍然发布了一个很好的解决方案,这个解决方案是我前面提到的,并且很容易将复杂的JSON发送到Asp.net MVC控制器操作,因此它们是模型绑定到任何强大的类型参数.
这个插件也支持日期,因此它们可以DateTime
毫无问题地转换为对应日期.
您可以在我的博客文章中找到我检查问题的所有详细信息,并提供完成此操作所需的代码.
您所要做的就是在客户端使用此插件.Ajax请求看起来像这样:
$.ajax({ type: "POST", url: "SomeURL", data: $.toDictionary(yourComplexJSONobject), success: function() { ... }, error: function() { ... } });
但这只是整个问题的一部分.现在我们可以将复杂的JSON发布回服务器,但由于它将模型绑定到可能在属性上具有验证属性的复杂类型,因此事情可能会失败.我也有一个解决方案.我的解决方案利用了jQuery Ajax功能,其结果可能是成功的或错误的(正如上面的代码所示).因此,当验证失败时,error
函数将被调用,因为它应该是.