当我使用动态下拉列表时角色 ID 不存在

Role ID does not exist when i using dynamic dropdown list

我用这段代码创建了一个动态下拉列表:

[AllowAnonymous]
public ActionResult Register()
{
    var roles = db.Roles.Select(r => new { RoleID = r.Id, RoleName = r.Name }).ToList();
    ViewBag.Roles = new SelectList(roles, "RoleID", "RoleName");

    return View();
}

查看:

<div class="form-group">
    <label>نقش</label>
    <div class="col-md-10">
        @Html.DropDownListFor(item => item.UserRoles, ViewBag.Roles as SelectList, "-- Select --")
    </div>
</div>

当我 select 注册角色时显示此错误:

用户是在 table AspNetUsers 中创建的,而不是在 AspNetUserRoles 中创建的。

有什么问题? /**************************************************** **********************************************/

编辑

型号:

控制器:

[HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model, HttpPostedFileBase UserPhoto)
    {
        if (ModelState.IsValid)
        {
            model.DateRegister = DateTime.Now;
            var user = new ApplicationUser
            {
                UserName = model.UserName,
                Name = model.Name,
                Family = model.Family,
                PhoneNumber = model.PhoneNumber,
                Gender = model.Gender,
                BirthDay = model.BirthDay,
                DateRegister = model.DateRegister,
                IsActive = false,
                Email = model.Email
            };

            if (UserPhoto != null)
            {
                UserPhoto = Request.Files[0];
                var ext = System.IO.Path.GetExtension(UserPhoto.FileName);
                if (ext == ".jpeg" || ext == ".jpg" || ext == ".png")
                {

                    string filename = model.PhoneNumber + ext;
                    UserPhoto.SaveAs(Server.MapPath(@"~/Image/" + filename));
                    user.UserPhoto = filename;
                }
            }

            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {

                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                await UserManager.AddToRoleAsync(user.Id,model.UserRoles);
                return RedirectToAction("Index", "Home");
            }
            AddErrors(result);
        }
        return View(model);
    }

AFAIK,AddToRoleAsync 方法需要 2 个输入参数:用户 ID 和角色名称作为字符串,而不是角色 GUID。

主要问题是 SelectList 在第一个 Register 操作方法上传递了 RoleID 第二个输入参数的内容而不是 RoleName,这会抛出异常,因为角色 GUID 肯定不会' 在处理 POST 请求时存在角色名称。因此,应更改控制器代码以将角色名称作为值传递给 DropDownListFor:

[AllowAnonymous]
public ActionResult Register()
{
    var roles = db.Roles.Select(r => new { RoleID = r.Id, RoleName = r.Name }).ToList();
    ViewBag.Roles = new SelectList(roles, "RoleName", "RoleName");

    return View();
}

此时,DropDownListFor 确保 model.UserRoles 通过 RoleName 作为角色分配的角色名称值。

参考文献:

UserManagement.AddToRoleAsync = https://msdn.microsoft.com/en-us/library/dn497537(v=vs.108).aspx

选择列表 = https://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.118).aspx