2016-12-20 52 views
0

控制器列表:得到遏制車型在控制器

[HttpPost] 
public ActionResult GetChecked(FormCollection formCollection) 
{ 
    var checked = formCollection["Checked"].Split(','); 
    var ids = formCollection["Original.ID"].Split(','); 
} 

查看:

@model IEnumerable<Models.Entry> [] 

<table> 
@using (Html.BeginForm("GetChecked", "ControllerName")) 
{ 
     @foreach (var item in Model[0]) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(modelItem => item.Original.ID) 
        @Html.HiddenFor(modelItem => item.Original.ID) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.Original.Name) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.New.Name) 
       </td> 
       <td> 
        @Html.CheckBoxFor(modelItem => item.Checked) 
       </td> 
      </tr> 
     } 
</table> 

//Then there's another table with Model[1] 

型號

public class Entry 
{ 
    public Entry() 
    { 
     Original = new SomeObject(); 
     New = new SomeObject(); 
     Checked = false; 
    } 

    public SomeObject Original { get; set; } 
    public SomeObject New { get; set; } 
    public bool Checked { get; set; } 
} 

這個工作,但是ids -array在我的控制器都獲得一個true和檢查行的錯誤值。我讀到這是因爲FormCollection。 問題:我如何讓GetChecked代替IEnumerable<Models.Entry>作爲參數?當我嘗試它時,它導致一個空值。

+0

您的@model聲明之後的[]是否在那裏?從來沒有見過他們之前在那裏使用過。 – VisualBean

回答

0

有一對夫婦的事情,你應該改變:

  • 當使用CheckBoxFor,EditorFor等你一個列表或數組呈現控件應該從不使用foreach - 相反,始終使用for -loop並將索引應用於您的集合。其原因是,索引創建在編號的項目你<form>認爲然後彼此那些編號的項目不再衝突,正是你需要成功地處理提交值的列表內容。看到這個答案的一個簡單的例子:https://stackoverflow.com/a/15375949/1220550

  • 不要使用FormCollection,而是使用ViewModel類。通過使用FormCollection,您放棄Databinding/ModelState/ValidationSummary,它們一起是ASP.NET MVC的優秀特性。在這裏解釋這一切太過分了,但是這裏的確是這樣做的。

  • 最好是用一個完全定義的視圖模型類,不僅爲綁定(見之前)也爲一致性和易用性的使用。爲IEnumerable<X>陣列爲您@model是最好的混亂,而在最壞的錯誤的原因。如果突然你還想通過int?不可能與IEnumerable<X>[],但與ViewModel一塊蛋糕 - 只需將其添加到類。

+0

我已經完成了所有的工作,並且工作正常,非常感謝你=)。 – mdc