【问题标题】:asp.net mvc Binder not update the RoleId value in Edit viewasp.net mvc Binder 不更新编辑视图中的 RoleId 值
【发布时间】:2018-05-24 14:53:18
【问题描述】:

我有一个这样的扩展用户类:

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>

当我发送表单时,角色集合是空的。

为什么 Binder 不将角色添加到 Roles 集合中?

问候和感谢。

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

在获取操作中,模型包含角色的信息,并且视图正确显示了它。下拉列表显示可用角色,并且用户的角色显示为选中状态。当我在视图中选择另一个不同的角色并发送表单时,在 Post 操作中,模型的 Roles 集合不再包含信息。

GET action

POST action

不知道怎么调试Binder的工作

【问题讨论】:

  • 调试并检查为什么角色为空,您是否在获取请求中获取模型?如果那么请正确检查它是否具有约束力。此外,我们只能在您在此处添加的代码中看到用户模型,其他代码如角色和所有,请添加它们以便于检查。
  • 不能用单独的 ViewModel 代替 POCO Entity 类吗?
  • 赢了,当然。我可以使用 ViewModel。但我的问题是,为什么Binder不自动填写信息?

标签: c# asp.net-mvc entity-framework


【解决方案1】:

为什么 Binder 没有将角色添加到 Roles 集合中?

这是因为@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&lt;string&gt; SelectedRoles { get; set; } 属性。

另一种选择是使用IModelBinder 接口创建自定义模型绑定器。此选项为您提供了将请求数据映射到模型的无限能力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    相关资源
    最近更新 更多