用户模型
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; }
}
使用这两个模型我正在创建一个编辑页面,用户可以进入并编辑他们拥有的宠物。
为了让他们知道他们有哪些宠物我试图使用复选框。
编辑页面
@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
显示一个复选框。
答案 0 :(得分:3)
是的。您应该为UserPetsModel
创建EditorTemplate。它看起来像:
@model UserPetsModel
@Model.Pet.AnimalName
<div>
@Html.CheckBoxFor(model => model.UserHasPet)
</div>
然后你可以做到:
@Html.EditorFor(model => model.UserPets)
EditorFor
将为您创建正确的绑定。请注意,您应该仅为UserPets
创建 EditorTemplate ,它也适用于List<UserPetsModel>
和IEnumarable<UserPetsModel>
,其语法与我显示的相同。
答案 1 :(得分: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>
在(〜/ Views / Shared / EditorTemplates / UserPets.cshtml)中定义一个视图,如:
@model UserPetsModel
@Html.HiddenFor(x => x.Pet.PetId)
@Html.LabelFor(x => x.UserHasPet, Model.Pet.AnimalName)
@Html.CheckBoxFor(x => x.UserHasPet)