剃刀复选框的型号列表

问题描述:

用户模型剃刀复选框的型号列表

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

改变它为循环,因为模型联编程序需要索引列表 –

是的。您应该为您的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>使用与我显示的相同的语法。

我建议用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)