我使用的是asp.net mvc 3,并且有强类型的模型要传递给它。如果数据的形式正确,模型就会接受数据。这种形式要求数据以NameMatchingModel=value
和&
分隔。例如,如果我有:
视图模型:
public class CarViewModel
{
public Car Car { get; set; }
}
public class Car
{
public string Make { get; set; }
public string Model { get; set; }
}
然后我有了一个接受ViewModel 的方法
public ActionResult AcceptCarVM( CarViewModel model )
{
//TODO: use car data
return View();
}
现在,我想传递的视图模型充满了一些细节的汽车。有比这种手动方式更好的方法吗?
var carMake = "Ford";
var carModel = "Pinto";
var viewModelData = "Car.Make=" + carMake + "&Car.Model=" + carModel;
var encodeData = encodeURIComponent(viewModelData);
$.ajax({
url: "@(Url.Action("AcceptCarVM"))",
type: 'GET',
data: encodeData,
success: function (result) {
//TODO: use result
}
});
$.param
这是的文档
您当然会以不同的方式提供您的数据。。。但由于您正在嵌套类型,我可以建议使用.toDictionary插件,该插件将正确地序列化JSON对象,而不管其结构如何,并以Asp.netMVC在数据绑定时能够理解的方式转换日期。
var data = {
Car: {
Make: "Ford",
Model: "Pinto"
}
};
$.ajax({
url: "@(Url.Action("AcceptCarVM"))",
type: 'GET',
data: $.toDictionary(data),
success: function(result) {
// TODO: use result
}
});
甚至:
var data = {
Make: "Ford",
Model: "Pinto"
};
$.ajax({
url: "@(Url.Action("AcceptCarVM"))",
type: 'GET',
data: $.toDictionary(data, "Car"), // will provide root object's name
success: function(result) {
// TODO: use result
}
});
第二种方法在控制器操作采用两个相同类型的参数时特别有用,因此您可以提供与操作参数名称相同的根对象名称,这样它们就可以正确地获得服务器端绑定的数据,即:
public ActionResult AcceptCarVM(CarViewModel carOne, CarViewModel carTwo) { ... }
插件内部使用jQuery功能,因此它可以可靠地序列化内容,特别适合Asp.net MVC后端。