2014-09-04 46 views
0

我試圖讓用戶更新數據庫中複選框的值。訪問控制器中複選框的值 - DB

該視圖列出了數據庫中所有可用的工作人員。 但當我嘗試訪問複選框的列表,該視圖傳遞錯誤的數據 前。只有3個複選框,它發送5個真/假值。

我真的很感激任何幫助。

查看樣本代碼

@using (Html.BeginForm("UpdateWorkersForTask", "Tasks", FormMethod.Post)) 
{ 
<table> 
    <tr> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.isChecked) 
       @Html.CheckBox("WorkersID", item.isChecked) 

     </tr> 
    } 

和CONTROLER是

[HttpPost] 
public ActionResult UpdateWorkersForTask(IEnumerable<bool> WorkersID, IEnumerable<string> hiddens) { } 

回答

1

因爲通過設計@Html.CheckBox@Html.CheckBoxFor呈現2個輸入,一個複選框和一個隱藏的輸入。如果你檢查的HTML你會看到類似的東西

<input name="WorkersID" type="checkbox" value="true"> 
<input name="WorkersID" type="hidden" value="false"> 

原因是未選中的複選框不回發。所以第二個輸入可確保將值返回。在複選框被選中的情況下,DefaultModelBinder讀取第一個值爲true並忽略第二個值(因爲它具有相同的名稱)。

在你的情況下,你不是綁定到你的模型,而是你只是讀取名稱爲WorkersID的所有輸入。如果您有3個項目,但是有5個值被重新發布,這意味着您選中了2個框。

爲了解決這個問題,修改您的觀點和行動方法如下(注意你的模型需要的IList所以for循環的作品,或者您可以使用自定義EditorTemplate

查看

for(int i = 0; i < Model.Count i++) 
{ 
    @Html.CheckBoxFor(m => m[i].WorkersID) 
} 

控制器

[HttpPost] 
ActionResult UpdateWorkersForTask(IEnumerable<YourModelType> model) 
{ 
    foreach(YourModelType item in model) 
    { 
    // do something with the value of item.WorkersID 
+0

非常感謝Mr.Stephen – 2014-09-05 19:04:39