0

ich eine dynamische Drop-Down-Liste mit diesem Code erstellen:Rollen-ID nicht existiert, wenn i dynamische Drop-Down-Liste mit

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

Ausblick:

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

Als ich die Rolle für Register wählen Zeigen Sie mir dieses Fehler:

enter image description here

Benutzer in Tabelle erstellt wird AspNetUsers aber nicht in AspNetUserRoles.

Was ist das Problem? /************************************************ ********************************************/

bearbeiten

Modell:

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

Ich glaube, Sie SelectListItem statt Select benötigen. –

+0

es gibt alle Rolle in Dropdown-Liste – Kianoush

+0

Ihre Ansicht in stark an Ihre 'ViewModel' Klasse gebunden, während von Controller-Aktion' Register' übergeben Sie nicht 'ViewModel' zu' View' – mmushtaq

Antwort

1

AFAIK, AddToRoleAsync Methode erfordert 2 Eingangs Parameter: Benutzer-ID und Rollenname als Zeichenfolge, nicht Rollen-GUID.

Das Hauptproblem ist SelectList auf erste Register Aktionsmethode RoleID Inhalt für die zweite Eingabeparameter übergeben statt RoleName, die seit Ausnahme werfen Rolle GUID sicherlich nicht für Rollennamen existieren, wenn POST Anfrage ist. Daher sollte Controller-Code geändert werden Rollennamen als Wert weitergeben 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(); 
} 

An dieser Stelle stellt sicher, dass DropDownListFormodel.UserRoles für Rollenzuweisung mit RoleName als Rollenname Wert übergeben.

Referenzen:

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

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