0

Je crée une liste déroulante dynamique avec ce code:ID de rôle n'existe pas quand je l'aide liste déroulante dynamique

[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(); 
} 

Vue:

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

Lorsque je sélectionne le rôle pour ENREGISTRER afficher ce erreur:

enter image description here

utilisateur est créé dans le tableau AspNetUsers mais pas au AspNetUserRoles.

Quel est le problème? /******************************************* *****************************************/

Modifier

Modèle:

enter image description here

Contoller:

[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); 
    } 
+0

Je pense que vous avez besoin SelectListItem au lieu de SelectList. –

+0

il retourne tous les rôles dans la liste déroulante – Kianoush

+0

Votre vue dans fortement lié à votre classe 'ViewModel' tandis que de l'action Contrôleur' Register' vous ne passez pas votre 'ViewModel' à' View' – mmushtaq

Répondre

1

AFAIK, méthode AddToRoleAsync nécessite 2 entrées paramètres: ID utilisateur et nom de rôle sous forme de chaîne, pas de GUID de rôle.

Le principal problème est SelectList sur la première méthode d'action Register passé contenu RoleID pour la deuxième paramètre d'entrée au lieu de RoleName, qui jeter exception car rôle GUID n'existe certainement pas pour le nom de rôle lors du traitement POST demande. Par conséquent, le code du contrôleur doit être modifié pour transmettre le nom du rôle en tant que valeur sur 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(); 
} 

À ce stade, DropDownListFor assure que model.UserRoles passé avec RoleName comme valeur de nom de rôle pour l'attribution des rôles.

Références:

Why does a role shows as "not exist" even when present in the database (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