如何使用AJAX POST将2个复杂参数传递给ActionResult?

时间:2012-01-30 22:34:56

标签: jquery ajax json asp.net-mvc-3

我的控制器中有一个动作结果函数,它是通过AJAX POST从客户端调用的。它过去只接受一个复杂的参数,工作正常。由于我有更多的要求,我现在需要它采取2个复杂的参数。使用2个参数模型Binder似乎无法以正确的方式序列化传入的数据(我得到了空值)。传入的参数在字符串化版本中应该是什么样的?

例如:

public ActionResult Bla(Person p, Car c)
{}

public class Person
{
  public string FirstName;
  public string LastName;
}

public class Car
{
  public string Make;
  public string Model;
} 

我曾经只发送过1个字符串化的JSON对象(例如Person)。现在我试图将Person和Car粘合到一个JSON对象中。这是我出错的地方吗?

我按以下方式构建JSON对象:

var person= {};
person['FirstName'] = 'Bob';
person['LastName'] = 'Jones';
//now same for c
var params = JSON.stringify({ 'p': person, 'c': car});

        $.ajax({
            url: '/Controller/bla',
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            data: params,
//and so on

我尝试了其他几种构建这些参数的方法,但它们似乎也没有用。

2 个答案:

答案 0 :(得分:1)

这里的诀窍是真正检查firebug中发布的内容:

您希望参数看起来像:

person.FirstName 

如果你发布像

这样的对象
 var personData = {
        FirstName: "First",
        LastName: "Last"

    };
 $.ajax({
        type: "POST",
        url: "/Product/Bla",
        data:  personData 
        })
    });

您的参数看起来像

person[FirstName]

一种简单的方法是使用Nick Frost的插件更改发布的参数

http://www.nickriggs.com/posts/post-complex-javascript-objects-to-asp-net-mvc-controllers/

答案 1 :(得分:0)

您可以将它们作为json对象传递给2个不同的属性(操作中定义的名称)。 这样的事情,你不必stringify它只是传递它,如下所示,jQuery将负责它。

$.ajax({
    url:"../Controller/bla",
    contentType: "application/json",
    data: {
        p: {
           FirstName: "FristName",
           LastName: "LastName"
        },
        c: {
           Make: "Make",
           Model: "Model"
        }
    },
    success: function(){  
    }
});