2013-02-05 195 views
0

我有一個包含幾列的模式:MVC3從控制器保存數據,查看回控制器

[Display(Name = "Facilities")] 
public List<facility> Facilities { get; set; } 

[Display(Name = "Accreditations")] 
public List<accreditation> Accreditations { get; set; } 

我最初填充這些名單從我的控制器:

public ActionResult Register() 
{ 
    var viewModel = new RegisterModel(); 

    viewModel.Facilities = m_DBModel.facilities.ToList(); 
    viewModel.Accreditations = m_DBModel.accreditations.ToList(); 

    return View(viewModel); 
} 

當他們到達我的觀點是他們填充了數據庫記錄(很棒)。然後我通過模型,其顯示這些列表爲複選框,準備用於用戶操縱的部分視圖(基於使用用於循環,而不是foreach循環另一個建議我曾嘗試,並沒有區別):

@model LanguageSchoolsUK.Models.RegisterModel 

@foreach (var item in Model.Facilities) 
{ 
    @Html.Label(item.name); 
    @Html.CheckBox(item.name, false, new { id = item.facility_id, @class = "RightSpacing", @description = item.description }) 
} 

當我提交表格,並回到我的控制器結束這次呼叫控制器上的重載寄存器功能:

[HttpPost] 
public ActionResult Register(RegisterModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // Do stuff 
    } 

    return View(model); 
} 

的問題是包含列表(設施和認證)的模型參數是告訴我,名單爲空。

請有人可以告訴我我做錯了什麼,爲什麼他們不填充我最初通過的集合,並希望有一種方法來要求那些被檢查過的東西?

謝謝。

回答

1

基於使用循環,而不是 foreach循環的另一個建議,我都試過了,沒有什麼區別

再試一次,我相信你將有更多的運氣這個時候。哦,使用強類型的輔助方法:

@model LanguageSchoolsUK.Models.RegisterModel 
@for (var i = 0; i < Model.Facilities.Count; i++) 
{ 
    @Html.HiddenFor(x => x.Facilities[i].name) 
    @Html.LabelFor(x => x.Facilities[i].IsChecked, Model.Facilities[i].name); 
    @Html.CheckBoxFor(
     x => x.Facilities[i].IsChecked, 
     new { 
      id = item.facility_id, 
      @class = "RightSpacing", 
      description = item.description // <!-- HUH, description attribute???? 
     } 
    ) 
} 

而且你肯定會從我的答案注意到複選框與模型布爾字段,不是整數,小數不,不是字符串=>布爾工作。

因此,請確保您的模型上有一個布爾型字段,它將保存複選框的狀態。在我的例子中,這個字段被稱爲IsChecked,但顯然你可以完全自由地發現它是一個更好的名字。

+0

輝煌的工作完全符合我的要求。謝謝你的幫助! – Yos

+0

哦,是的,描述是一個JavaScript函數採取desc並顯示在彈出。 – Yos

+0

您可以使用HTML5 data- *屬性,而不是有效的:'data_description = item.description'。 –