在ASP.NET MVC中发布到控制器后,Dropdownlist值为null

时间:2017-11-24 20:34:14

标签: asp.net-mvc html.dropdownlistfor

我可以为所选用户获得所有角色和实际角色,但是当我发布到EditUser操作时,Dropdownlist会发送null。 我的意思是当表单发布到我的控制器时,我从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获取 /提前致谢!

2 个答案:

答案 0 :(得分:1)

表单回发成功表单控件的名称/值对。您使用<select>生成name="RoleId"元素,但您的模型不包含名为RoleId的属性。由于您要将所选选项绑定到ApplicationRoleId角色属性,因此您需要查看

@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

答案 1 :(得分:0)

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