ASP.NET MVC模型绑定与jQuery ajax请求

7 浏览
0 Comments

ASP.NET MVC模型绑定与jQuery ajax请求

我在我的MVC代码中有一个服务器端对象,它看起来像这样:

class Person
{
  public long Id { get; set; }
  public string Name { get; set; }
  public IList Friends { 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对象以及正确的属性名称(NameId),但是每个Friend对象的属性值NameId的值都是null或0,即使客户端发送了值。

请帮忙解决。

0
0 Comments

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方法。

0
0 Comments

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数据进行字符串化,也应该使用这种解决方法。

0
0 Comments

在ASP.NET MVC中有一个bug,他们拒绝修复,如果集合属性的名称以类型名称开头,就无法绑定。解决方法是将属性名称更改为不以类型名称开头,例如将"Friends"改为"Biscuits"或"MyFriends"。这是一个临时的解决方法,但可以解决问题。

0