1

我正在使用 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
        }
});
4

1 回答 1

2

jQuery具有序列化查询字符串的功能

$.param

这是文档

您当然会以不同的方式提供您的数据...但是由于您正在嵌套类型,我建议您使用.toDictionary插件,该插件将正确序列化 JSON 对象而不管其结构如何,并以 Asp 的方式转换日期.net MVC 会在数据绑定时理解。

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 后端。

于 2012-09-03T23:28:58.787 回答