剃刀复选框的型号列表
问题描述:
用户模型剃刀复选框的型号列表
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
显示一个复选框。
答
是的。您应该为您的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)
改变它为循环,因为模型联编程序需要索引列表 –