如果您使用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",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¶m2=2
我认为这是因为我实际上已经创建了一个JSON对象作为数据,并将属性设置为对象的名称.
Firebug中出现的POST值有所不同.当我单独发布对象时,POST值是对象/表单的所有键及其对应的值.在第二个例子中有两个简单的属性,我给它们的名称,每个属性包含一个QueryString(Foo = 1& Bar = 2),MVC不能将QueryString映射到一个对象的成员(或者它会出现).
反正有没有像第一次那样开始工作,还要将额外的数据发送到Action的第二个参数?我猜这是为jquery执行表单序列化时创建的所有现有属性添加一个额外的属性.
我真正想要的POST是:
Name: "Bob" Age: "999" Sex: "Unknown" TheWeirdQueryString: param1=1¶m2=2
解决方法
$.ajax方法中的dataType参数是响应的类型(您希望从服务器返回的数据类型),而不是请求.试试这个:
function PostForm() { $.ajax({ url: "/Home/TestMVC",data: $('#form').serialize() + "&" + $('.additionalParams').serialize() }); };
要么:
function PostForm() { $.ajax({ url: "/Home/TestMVC" + "?" + $('.additionalParams').serialize(),data: $('#form').serialize() }); };
更新:
尝试这个:
控制器:
public void TestMVC(MyObject obj,String[] TheWeirdQueryString) { }
客户:
function PostForm() { $.ajax({ url: "/Home/TestMVC",data: $('#form').serialize() + "&" + $('.additionalParams').serialize() }); };
但在客户端,您的其他参数必须采用以下格式:
TheWeirdQueryString[0]=param1&TheWeirdQueryString[1]=param2&...&TheWeirdQueryString[n]=paramN
所以$(‘.additionalParams’)元素必须具有“id”和/或“name”属性,如:TheWeirdQueryString [1],TheWeirdQueryString [2] … TheWeirdQueryString [N]
希望这可以帮助