2015-07-10 102 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輸入做了。