我有一个扩展的User类,如下所示:

public class User : IdentityUser
{
  public string Nombre { get; set; }
  public string Apellidos { get; set; }
  public int DepartamentoID { get; set; }
  public Departamento Departamento { get; set; }
}


在我的“编辑”视图中,我具有以下字段定义:

<div class="form-group">
   @Html.LabelFor(model => model.Roles.FirstOrDefault().RoleId, htmlAttributes: new { @class = "control-label col-md-2" })
   <div class="col-md-10">
      @Html.DropDownListFor(m => m.Roles.ElementAtOrDefault(0).RoleId, (SelectList)ViewBag.RoleList, "Seleccionar un rol", new { @class = "form-control" })
      @Html.ValidationMessageFor(model => model.Roles.FirstOrDefault().RoleId)
   </div>
</div>


当我发送表单时,“角色”集合为空。

为什么活页夹未将角色添加到“角色”集合中?

问候和感谢。

我尝试添加更多信息以回应Rajesh的评论。

在“获取”操作中,模型包含角色的信息,并且视图正确显示了该信息。下拉列表显示可用角色,并且用户的角色显示为已选择。在视图中选择其他角色并发送表单后,在“发布”操作中,模型的“角色”集合不再包含信息。

GET action

POST action

我不知道如何调试活页夹的工作

最佳答案

为什么活页夹未将角色添加到“角色”集合中?


发生这种情况是因为@Html.DropDownListFor和默认模型联编程序不够聪明。您的@Html.DropDownListFor会生成如下内容:

<select class="form-control" id="RoleId" name="RoleId">
    <option value="1">Role_1</option>
    <option value="2">Role_2</option>
</select>


由于name=RoleId,模型绑定器将尝试将其绑定到模型的RoleId属性,并且对Roles属性一无所知,而且Roles属性是可枚举的。

要使其正常工作,您的模型必须具有RoleId属性,或者如果要选择多个角色,可以使用Html.ListBoxFor扩展名:

@Html.ListBoxFor(m => m.SelectedRoles, (SelectList)ViewBag.RoleList, new { @class = "form-control" })


然后,您的模型必须具有public List<string> SelectedRoles { get; set; }属性。

另一个选择是使用IModelBinder界面创建自定义模型联编程序。此选项为您提供了将请求数据映射到模型的无限功能。

关于c# - asp.net mvc Binder无法在“编辑” View 中更新RoleId值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50512380/

10-08 23:28