2015-07-10 104 views
1

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

我传递给我的页面的viewmodel有一个属性,一个汽车列表。

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

在视图我循环通过每个和输出作为形式

@for (int i = 0; i < Model.Cars.Count; i++) 
    { 
     <form action="#" id="[email protected][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) 

,因为当窗体数据被序列化并且发布名称通过 Cars [0] .Id和模型联编程序无法绑定。这是我的理解。

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

回答

2

使用foreach循环并使用您的汽车模型的属性。然后发布到更新行动时,你的模型应该绑定:

@foreach (var car in Model.Cars) 
    { 
     <form action="#" id="[email protected]" class="updateForm"> 
      @Html.AntiForgeryToken() 
      @Html.Hidden("Id", car.Id) 
+0

我删除了我的答案,因为我没有注意到OP创造了每节车厢的新形式。这是在这种情况下 – user5103147

+0

正确的答案,我是正确的在说你不能在这里使用TextBoxFor(),并且必须使用TextBox(car.CarName,car.CarName,new {...})?因为TextBoxFor()需要一个lambda表达式。 – VictorySaber

0

如果您一次只发送一个汽车实例,那么您实际上不需要包含迭代器来将表单输入名称呈现为每个表单,而只是将输入发送到其自己的范围内。

然后你只需要接受一个汽车模型,就像你在原来的问题陈述:

public JsonResult Update(Car car) 

你只需要确保覆盖由助手提供的默认ID和名称,就像你用CarName输入做了。