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

如果您使用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. } 

post:

 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 

$ .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]

希望这可以帮助

数据是一个对象

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

另一种解决方案,如果您需要键/值对的字典:

 public void TestMVC(MyObject obj, IDictionary TheWeirdQueryString) { } 

客户:

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

$(’。additionalParams’)。serialize()格式:

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

更新:

你需要这样的东西: