从FormCollection中填写模型

时间:2015-07-10 16:27:04

标签: asp.net-mvc model-binding

我想用FormCollection中的数据填充我的模型。

我传递给我的页面的viewmodel有一个属性,一个List of Cars。

public List<Car> Cars { get; set; }

在视图中,我循环遍历每个并输出为表单

@for (int i = 0; i < Model.Cars.Count; i++)
    {
        <form action="#" id="updateForm-@Model.Cars[i].Id" class="updateForm">
            @Html.AntiForgeryToken()
            @Html.Hidden("Id", Model.Cars[i].Id)
            <div class="row">
                <div class="col-md-2 col-sm-4">
                    @Html.TextBoxFor(m => m.Cars[i].CarName, new { placeholder = "car name", name = "CarName", id = "CarName", @class = "user-friendly-size" })
                </div>

等。每个表单都有自己的按钮。

然后我使用JQuery form.serialise并将表单数据发送到后端

[AjaxOnly]
    public JsonResult Update(FormCollection form)

据我了解,我不能使用模型装订器,即

    public JsonResult Update(Car car)

因为当表单数据被序列化并发布时,名称来自 汽车[0] .Id,模型绑定器无法绑定。这是我的理解。

是否有办法以简单的方式将FormCollection中的值提取到我的模型中?可能使用反射?或者我错了,我们可以自动绑定?

2 个答案:

答案 0 :(得分:2)

使用foreach循环并使用您的汽车模型的属性。然后,在发布到Update操作时,您的模型应该绑定:

@foreach (var car in Model.Cars)
    {
        <form action="#" id="updateForm-@Model.Id" class="updateForm">
            @Html.AntiForgeryToken()
            @Html.Hidden("Id", car.Id)

答案 1 :(得分:0)

如果您一次只发送一个Car实例,那么您真的不需要包含迭代器来呈现表单输入名称,因为每个表单只是在自己的范围内发送输入。

然后你只需要收到一个汽车模型,就像你在原始问题中说的那样:

public JsonResult Update(Car car) 

您只需要确保覆盖帮助程序给出的默认ID和名称,就像使用CarName输入一样。