在 ASP.NET MVC 中发布到控制器后,下拉列表值为空

Dropdownlist value is null after posting to controller in ASP.NET MVC

我可以获得所有角色以及所选用户的实际角色,但是当我发布到 EditUser 操作时,Dropdownlist 发送空值。 我的意思是当表单发布到我的控制器时,我从 DropDownList 中得到 null。

这是我的模型

public class EditUserViewModel
    {
      public string Id { get; set; }
      public string Name { get; set; }
      public string Email { get; set; }
      public List<SelectListItem> ApplicationRoles { get; set; }
      public string ApplicationRoleId { get; set; }
    }

这是行动

[HttpGet]
            public async Task<ActionResult> EditUser(string id)
            {
                EditUserViewModel model = new EditUserViewModel();
                model.ApplicationRoles = RoleManager.Roles.Select(r => new SelectListItem
                {
                    Text = r.Name,
                    Value = r.Id
                }).ToList();


                if (!String.IsNullOrEmpty(id))
                {
                    ApplicationUser user = await UserManager.FindByIdAsync(id);
                    if (user != null)
                    {
                        var role = await UserManager.GetRolesAsync(user.Id);
                        var existingRole = role.First();
                        string existingRoleId = RoleManager.Roles.Single(r => r.Name == existingRole).Id;
                        model.Id = user.Id;
                        model.FirstName = user.FirstName;
                        model.ApplicationRoleId = existingRoleId;
                        ViewBag.RoleId = new SelectList(RoleManager.Roles, "Id", "Name", model.ApplicationRoleId); 
                    }
                }
                return PartialView("_EditUser", model);
            }

这里是来自 _EditUser.cshtml

的 DropDownlist
<div class="form-group">
                @Html.Label("Role typ", htmlAttributes: new { @class = "control-label col-md-6" })
                <div class="col-md-12" title="Ange antal datorer som finns i lager">
                    @Html.DropDownList("RoleId", null, new { @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.ApplicationRoles, "", new { @class = "text-danger" })
                </div>
            </div>

仅从 DropDownList 获取 null,而不是从@Html.EditorFor /提前致谢!

因为您声明在控制器的该方法中只允许使用 HttpGet 方法。这就是为什么

Forms post 支持 name/value 对他们成功的表单控件。您使用 name="RoleId" 生成了 <select> 元素,但您的模型不包含名为 RoleId 的 属性。既然你要将选择的选项绑定到ApplicationRoleId角色属性,那么你view需要是

@Html.LabelFor(m => m.ApplicationRoleId)
@Html.DropDownListFor(m => m.ApplicationRoleId, Model.ApplicationRoles)
@Html.ValidationMessageFor(m => m.ApplicationRoleId)

备注:

  1. 您当前的 @Html.Label(..) 代码没有创建标签 与您的下拉列表相关联(点击它不会设置 焦点)
  2. ValidationMessageFor() 需要应用到 属性 你的 绑定到,而不是 SelectList
  3. 删除你的ViewBag.RoleId = new SelectList(..)代码。你有 已将选择列表分配给 ApplicationRoles 属性 (如果有视图模型,你永远不需要 ViewBag