Идентификатор роли не существует, когда я использую динамический раскрывающийся список

Я создаю динамический выпадающий список с этим кодом:

[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>

Когда я выбираю роль для регистрации, покажите мне эту ошибку:

введите здесь описание изображения

Пользователь создан в таблице 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);
    }

person Kianoush    schedule 10.10.2016    source источник
comment
Я думаю, вам нужен SelectListItem вместо SelectList.   -  person Aftab Ahmed    schedule 10.10.2016
comment
он возвращает все роли в выпадающем списке   -  person Kianoush    schedule 10.10.2016
comment
Ваше представление сильно привязано к вашему классу ViewModel, в то время как из действия контроллера Register вы не передаете свой ViewModel в View   -  person mmushtaq    schedule 10.10.2016
comment
обновить вопрос   -  person Kianoush    schedule 10.10.2016
comment
Я вижу, что ваш метод AddToRoleAsync передал параметр UserRoles как RoleId, а не Name, поэтому выдача IOE как роли не существует. Пожалуйста, покажите код вашего контроллера, который включает назначение ролей пользователей. На этот раз попробуйте ViewBag.Roles = new SelectList(roles, "RoleName", "RoleName"); и передайте значение DDL в метод AddToRoleAsync.   -  person Tetsuya Yamamoto    schedule 10.10.2016
comment
благодарю вас . это работает   -  person Kianoush    schedule 10.10.2016


Ответы (1)


Насколько мне известно, метод AddToRoleAsync требует 2 входных параметра: идентификатор пользователя и имя роли в виде строки, а не 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 в качестве значения имени роли для назначения роли.

Использованная литература:

Почему роль отображается как несуществующая, даже если она присутствует в базе данных (asp.net mvc)

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

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

person Tetsuya Yamamoto    schedule 10.10.2016