一尘不染

将复选框列表传递到视图中,并拉出IEnumerable [重复]

c#

我有一个与用户关联的项目列表。这是一对多的关系。我希望将整个项目列表传递到视图中,以便它们可以从尚未与其关联的项目中进行选择(还可以查看已经关联的项目)。我想从中创建复选框。然后,我想将选定的发送回控制器进行关联。如何传递所有列表(包括尚未关联的列表)并可靠地传递回它们以进行关联?

这是我首先尝试的方法,但是很明显,这是行不通的,因为我将输入基于通过AllItems集合传递的项目的基础,而集合与用户本身的Items无关。

<div id="item-list">
    @foreach (var item in Model.AllItems)
    {
        <div class="ui field">
            <div class="ui toggle checkbox">
                <input type="checkbox" id="item-@item.ItemID" name="Items" value="@item.Active" />
                <label for="item-@item.ItemID">@item.ItemName</label>
            </div>
        </div>
    }
</div>

阅读 222

收藏
2020-05-19

共1个答案

一尘不染

您不能使用foreach循环绑定到集合。您也不应该手动生成html,在这种情况下,由于未选中的复选框不会回发,因此无法正常工作。始终使用强类型的html帮助器,以便获得正确的双向模型绑定。

您尚未指示模型是什么,但是假设您有一个User并想要Roles为该用户选择,然后创建视图模型以表示您想要在视图中显示的内容

public class RoleVM
{
  public int ID { get; set; }
  public string Name { get; set; }
  public bool IsSelected { get; set; }
}
public class UserVM
{
  public UserVM()
  {
    Roles = new List<RoleVM>();
  }
  public int ID { get; set; }
  public string Name { get; set; }
  public List<RoleVM> Roles { get; set; }
}

在GET方法中

public ActionResult Edit(int ID)
{
  UserVM model = new UserVM();
  // Get you User based on the ID and map properties to the view model
  // including populating the Roles and setting their IsSelect property
  // based on existing roles
  return View(model);
}

视图

@model UserVM
@using(Html.BeginForm())
{
  @Html.HiddenFor(m => m.ID)
  @Html.DisplayFor(m => m.Name)
  for(int i = 0; i < Model.Roles.Count; i++)
  {
    @Html.HiddenFor(m => m.Roles[i].ID)
    @Html.CheckBoxFor(m => m.Roles[i].IsSelected)
    @Html.LabelFor(m => m.Roles[i].IsSelected, Model.Roles[i].Name)
  }
  <input type"submit" />
}

然后在post方法中,将绑定您的模型,您可以检查已选择了哪些角色

[HttpPost]
public ActionResult Edit(UserVM model)
{
  // Loop through model.Roles and check the IsSelected property
}
2020-05-19