我正在尝试使用jquery ajax函数发布到MVC2控制器操作,但我的参数包含一个(简单)自定义类的数组,并且操作无法正确获取数据。
客户端:
var element1 = { FirstName: 'Raymond', LastName: 'Burr' };
var element2 = { FirstName: 'Johnny', LastName: 'Five' };
var var2 = [element1, element2];
var var1 = 'some string';
var parms = {
var1: var1,
var2: var2
};
var ajaxArgs = {
type: "POST",
traditional: true,
url: "/Home/Test1",
data: parms,
dataType: "json",
success: returnSuccess,
error: returnError
};
$.ajax(ajaxArgs);
服务器:
[HttpPost]
public ActionResult Test1(string var1, List<TestParameterClass> var2) { ... }
public class TestParameterClass
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
2例已经有效的案例:
1)使用List&lt; _string&gt;作为动作参数并将javascript数组更改为字符串
阵列。
2)使用TestParameterClass作为动作参数并传递自定义类的1个实例。
所以真正的技巧似乎是获得一个成功传递的自定义类的数组以及其他平面(字符串)参数。
任何使这项工作的想法?还有关于MVC2如何将参数转换为某些C#类型的文档(我使用List&lt;&gt;只是b / c它似乎是最广泛使用的)?
谢谢!
答案 0 :(得分:0)
啊,Model Binder。在.NET MVC方面,这么多魔术的来源以及如此多的祸患的原因。 Model Binder是将参数转换为对象的东西,有时它对你传递的内容有点挑剔。
在这种特殊情况下,我认为您想要的是以
形式传递参数"people[0].FirstName": "Raymond",
"people[0].LastName": "Burr",
"people[1].FirstName": "Johnny",
"people[1].LastName": "Five"
基本上,如果您将模型绑定器传递给集合类型,则它希望使用数组样式索引(bracket-number)命名参数,然后使用属性名称。至少那是对我有用的东西;我不是MVC忍者。
答案 1 :(得分:0)
如果AJAX调用错误或者服务器上的输入模型绑定错误,我会尝试弄清楚。使用Firebug或Fiddler检查AJAX调用,特别是POST数据。如果它看起来正确,则问题很可能出在模型绑定中。
查看这篇文章,了解列表解析的一些“文档”: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
另一件要尝试的是创建一个样本页面,其中的表单模仿您通过AJAX传入的数据。如果您可以将表单设置为POST并正确绑定模型,那么您的AJAX调用也可能会起作用。