Razor复选框用于模型列表

时间:2016-01-20 10:06:10

标签: c# asp.net-mvc razor checkbox

用户模型

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显示一个复选框。

2 个答案:

答案 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)