2016-01-20 61 views
1

用戶模型剃刀複選框的型號列表

public class UserModel 
{ 
    public int UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Location { get; set; } 
    public IEnumerable<UserPets> UserPets { get; set; } 
} 

用戶寵物模式

public class UserPetsModel 
{ 
    public PetModel Pet{ get; set; } 
    public bool UserHasPet { get; set; } 
} 

使用這2種型號,我創建編輯頁面,用戶可以進來和編輯哪些寵物他們有。

爲了讓他們說出他們有哪些寵物,我正在嘗試使用複選框。

編輯頁面

@model Models.UserModel 

@using (Html.BeginForm()) 
{ 
    <div class="form-group"> 
     @Html.LabelFor(model => model.FirstName) 
     @Model.FirstName 
    </div> 

    @foreach (var userPets in Model.UserPets) 
    { 
     @Model.Pet.AnimalName 
     <div> 
      @Html.CheckBoxFor(u => userPets .UserHasPet) 
     </div> 
    } 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Save" class="btn btn-default" /> 
     </div> 
    </div> 
} 

我遇到的問題是試圖將UserModel映射回控制器動作時。當我按下保存按鈕時,UserModel上的所有內容都被映射回控制器,除了UserPetsModels,我相信這是由於使用了foreach。

是否有另一種方法可以在不使用foreach或for循環的情況下爲每個UserPetModel顯示一個複選框。

+1

改變它爲循環,因爲模型聯編程序需要索引列表 –

回答

3

是的。您應該爲您的UserPetsModel創建EditorTemplate。它看起來像:

@model UserPetsModel 

@Model.Pet.AnimalName 
<div> 
    @Html.CheckBoxFor(model => model.UserHasPet) 
</div> 

然後你就可以簡單地做:

@Html.EditorFor(model => model.UserPets) 

EditorFor將創建適合您具有約束力。請注意,您應該創建EditorTemplate只適用於UserPets,它也將爲List<UserPetsModel>IEnumarable<UserPetsModel>使用與我顯示的相同的語法。

1

我建議用EditorTemplate替換循環。所以,你的

@foreach (var userPets in Model.UserPets) 
    { 
     @Model.Pet.AnimalName 
     <div> 
      @Html.CheckBoxFor(u => userPets.UserHasPet) 
     </div> 
    } 

會是什麼樣子:

<div class="row"> 
     @Html.EditorFor(m => m.UserPets) 
    </div> 

而且在(〜/查看/共享/ EditorTemplates/UserPets.cshtml)像定義視圖:

@model UserPetsModel 
@Html.HiddenFor(x => x.Pet.PetId) 

@Html.LabelFor(x => x.UserHasPet, Model.Pet.AnimalName) 
@Html.CheckBoxFor(x => x.UserHasPet)