ASP.NET MVC模型绑定与jQuery ajax请求
ASP.NET MVC模型绑定与jQuery ajax请求
我在我的MVC代码中有一个服务器端对象,它看起来像这样:
class Person { public long Id { get; set; } public string Name { get; set; } public IListFriends { get; set; } } class Friend { public long Id { get; set; } public string Name { get; set; } }
从jQuery客户端,我正在进行ajax请求并发送以下数据(为了可读性而引入换行符):
var personId = $(... var personName = $(... var friends = []; // 一个关联数组的数组 for (var i = 0; i < _friends.length; i++) // _friends是一个全局数组对象,与下面的friends不同 { var friendId = $(... var friendName = $(...) friends[i] = { 'Id' : friendId, 'Name' : friendName }; }
...等等,以将值放入变量中
请注意,我正在将应该放入Person.Friends
,即IList
的内容作为一个JavaScript数组发送,其中数组的每个元素都是一个关联列表,该列表具有与服务器端Friend
类相同的属性。
这是我的ajax请求:
$.ajax('/Strings/JsonCreateNew', { cache: false, async: false, type: 'POST', data: { 'Id' : personId, 'Name' : personName, 'Friends' : friends}, dataType: 'json', error: SaveNewFriendClientSideHandler.OnError, success: SaveNewFriendClientSideHandler.OnSuccess });
在我的控制器中,只要我有一个FormCollection
来接收数据,我就可以获得所有的数据,但我想绑定到强类型的Person对象,所以如果我将控制器定义从:
[HttpPost] public ActionResult JsonCreateNew(FromCollection person) { // 我可以在person.AllKeys属性中获取所有数据 return new EmptyResult(); }
改为:
[HttpPost] public ActionResult JsonCreateNew(Person person) { // 默认的ASP.NET MVC模型绑定器无法绑定到该对象 // 事实上,路由模块甚至不会将请求路由到这个操作,所以这个操作永远不会被触发。 return new EmptyResult(); }
我仍然可以获得所有的数据,但是我真的很关心IList
。
它以一个数组的形式被接收到Person
对象中,该数组具有正确数量的Friends
对象以及正确的属性名称(Name
和Id
),但是每个Friend
对象的属性值Name
和Id
的值都是null
或0,即使客户端发送了值。
请帮忙解决。
ASP.NET MVC Model Binding with jQuery ajax request是一个常见的问题,出现的原因是没有正确配置ajax请求的数据格式和内容类型,导致服务器端无法正确解析数据。解决方法是在ajax请求中添加contentType和JSON.stringify(),以确保数据以JSON格式发送到服务器端。
以下是解决问题的具体步骤:
1. 配置ajax请求的数据格式为JSON格式:
contentType: "application/json"
2. 使用JSON.stringify()方法将数据对象转换为JSON字符串:
data: JSON.stringify({ person: p })
通过以上两步配置,可以确保ajax请求中的数据以正确的JSON格式发送到服务器端。这样服务器端就可以正确解析并绑定到相应的Model对象。
另外,还有一些其他的问题和解决方法:
1. 如果遇到JSON.Stringify is not a function的报错,可能是因为没有引入正确的JSON库。需要确保引入了正确的JSON库,例如在HTML文件中添加以下代码:
2. 如果数据在服务器端接收到之后仍然为空对象,可能是因为没有正确使用表单的serialize方法。可以尝试使用表单的serialize方法将表单数据序列化为字符串,并作为ajax请求的数据发送到服务器端。
通过正确配置ajax请求的数据格式和内容类型,并使用JSON.stringify()方法将数据对象转换为JSON字符串,可以解决ASP.NET MVC Model Binding with jQuery ajax request的问题。在解决问题时需要注意引入正确的JSON库和正确使用表单的serialize方法。
ASP.NET MVC Model Binding with jQuery ajax request的问题出现的原因是没有指定内容类型。解决方法是在ajax请求中添加contentType: "application/json"
参数。即使不对post数据进行字符串化,这种解决方法也应该起作用。
一般情况下,当使用jQuery的ajax方法向ASP.NET MVC控制器发送请求时,数据绑定是自动完成的。然而,有时候可能会遇到一些问题,特别是在使用JSON数据时。
当发送ajax请求时,需要指定请求的内容类型。如果没有明确指定,那么默认的内容类型是application/x-www-form-urlencoded
。但是,当使用JSON数据时,应该将内容类型设置为application/json
。
具体解决方法如下:
$.ajax({ url: "/Controller/Action", type: "POST", data: jsonData, contentType: "application/json", success: function(response) { // 处理响应数据 } });
以上代码中,contentType: "application/json"
参数指定了请求的内容类型为JSON。这样,服务器端的Model Binding就能正确地将请求数据绑定到控制器的参数上。
需要注意的是,即使不对post数据进行字符串化(stringify),上述解决方法也应该起作用。因为指定了正确的内容类型,服务器端可以正确地解析请求数据。
在使用ASP.NET MVC Model Binding和jQuery ajax请求时,需要指定正确的内容类型contentType: "application/json"
,以确保数据能够正确地绑定到控制器的参数上。即使不对post数据进行字符串化,也应该使用这种解决方法。