通过jQuery.Ajax将多个项发送到MVC控制器

时间:2009-06-16 15:17:58

标签: jquery asp.net-mvc json controller arguments

如果您使用jQuery之类的序列化表单,它通常会将JSON键和值映射到您要发布到的Controller Action上的对象属性。所以:

jQuery的:

function PostForm() {
    $.ajax({
        url: "/Home/TestMVC",
        type: "POST",
        dataType: "application/JSON",
        data:  $('#form').serialize(),
        complete: callFunction
        }
    });

假设主要细节包含将参数名称作为键应该直接映射到对象的元素:

动作:

public void TestMVC(MyObject obj)
{
//Obj should now contain the data from the serialised form
}

POST:

Name: "Bob"
Age: "999"
Sex: "Unknown"

有谁知道这是如何工作的?每次我将表单 和任何其他数据 传递给控制器​​时,它就会中断。

我想发送数据的内容以及可以包含任意数量和类型的键/值对的QueryString到控制器。我可以在服务器上提取这些键/值对,因为我无法在方法签名上为它们创建对象。但是,这不能按预期工作。

jQuery的:

function PostForm() {

    $.ajax({
        url: "/Home/TestMVC",
        type: "POST",
        dataType: "application/JSON",
        data: 
        { 
           Obj: $('#form').serialize(),
           TheWeirdQueryString: $('.additionalParams').serialize(),
        }
    });
};

动作:

public void TestMVC(MyObject obj, String TheWeirdQueryString)
{
//Obj now does NOT contain the element, it is NULL. Whereas TheWeirdQueryString works fine. 
}

发表:

Obj: name=bob&age=999&sex="unknown"
TheWeirdQueryString: param1=1&param2=2

我认为这是因为我实际上已经创建了一个JSON对象作为数据,并将属性设置为对象的名称。

Firebug中出现的POST值存在差异。当我单独发布对象时,POST值是对象/表单的所有键及其对应的值。在第二个示例中,有两个简单的属性,我给它们的名称,每个属性包含一个QueryString(Foo=1&Bar=2),MVC无法将QueryString映射到对象的成员(或者它会出现)。

在第一个实例中是否仍然可以像上面那样开始工作,而且还要将额外的数据发送到Action的第二个参数?我猜这是为jquery执行表单序列化时创建的所有现有属性添加一个额外的属性。

我真正想要的POST是:

Name: "Bob"
Age: "999"
Sex: "Unknown"
TheWeirdQueryString: param1=1&param2=2

3 个答案:

答案 0 :(得分:5)

$ .ajax方法中的

dataType参数是响应类型(您希望从服务器返回的数据类型),而不是请求。试试这个:

function PostForm() {
    $.ajax({
        url: "/Home/TestMVC",
        type: "POST",
        dataType: "application/JSON",
        data: $('#form').serialize() + "&" + $('.additionalParams').serialize()
    });
};

或:

function PostForm() {
    $.ajax({
        url: "/Home/TestMVC" + "?" + $('.additionalParams').serialize(),
        type: "POST",
        dataType: "application/JSON",
        data: $('#form').serialize()
    });
};

<强>更新:

试试这个:

控制器:

public void TestMVC(MyObject obj, String[] TheWeirdQueryString)
{
}

客户端:

function PostForm() {
    $.ajax({
        url: "/Home/TestMVC",
        type: "POST",
        dataType: "application/JSON",
        data: $('#form').serialize() + "&" + $('.additionalParams').serialize()
    });
};

但在客户端,您的其他参数必须采用以下格式:

TheWeirdQueryString[0]=param1&TheWeirdQueryString[1]=param2&...&TheWeirdQueryString[n]=paramN

所以$('。additionalParams')元素必须具有“id”和/或“name”属性,如:TheWeirdQueryString [1],TheWeirdQueryString [2] ... TheWeirdQueryString [N]

希望这有帮助

答案 1 :(得分:0)

数据是一个对象

...
data: { 
    x :$('#form').serialize(), 
    y:'something else'
}
...

答案 2 :(得分:0)

另一种解决方案,如果你想要一个键/值对字典:

public void TestMVC(MyObject obj, IDictionary<string, object> TheWeirdQueryString)
{
}

客户端:

function PostForm() {
    $.ajax({
        url: "/Home/TestMVC",
        type: "POST",
        dataType: "application/JSON",
        data: $('#form').serialize() + "&" + $('.additionalParams').serialize()
    });
};

$('。additionalParams')。serialize()format:

TheWeirdQueryString[0].Key=param0&TheWeirdQueryString[0].Value=value0&TheWeirdQueryString[1].Key=param1&TheWeirdQueryString[1].Value=value1&...&TheWeirdQueryString[n].Key=paramN&TheWeirdQueryString[n].Value=valueN

<强>更新:

你需要这样的东西:

<input class="additionalParams" type="text" name="TheWeirdQueryString[0].Key" value="param0" />
<input class="additionalParams"type="text" name="TheWeirdQueryString[0].Value" value="value0" />
<!-- ... -->
<input class="additionalParams"type="text" name="TheWeirdQueryString[n].Key" value="paramN" />
<input class="additionalParams"type="text" name="TheWeirdQueryString[n].Value" value="valueN" />