2016-06-11 1 views
0

Salut là) Je suis un débutant dans ASP et je réalise la sécurité basée sur les rôles dans mon projet, en utilisant la classe ApplicationUsers. J'ai donc créé une page, où admin peut définir des rôles pour les utilisateurs, mais je ne peux pas définir un autre rôle pour l'utilisateur, car la méthode editState.IsValid est false car elle ne peut pas convertir la valeur de l'ID de chaîne en rôle. J'ai essayé de définir la valeur de ModelState, mais je ne peux pas parce qu'il n'a pas de setter. Aide, s'il vous plaît, comment puis-je le réparer d'une autre manière? Mon code ci-dessous ...Asp set rôle ModelState.IsValid est false

public ActionResult Edit(string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     ApplicationUser applicationUser = db.Users.Find(id); 
     if (applicationUser == null) 
     { 
      return HttpNotFound(); 
     } 
     var roles = db.Roles.Select(x => new SelectListItem { Text = x.Name, Value = x.Id }).ToArray(); 
     ViewBag.Roles = roles; 
     return View(applicationUser); 
    } 

    // POST: ApplicationUsers/Edit/5 
    // Чтобы защититься от атак чрезмерной передачи данных, включите определенные свойства, для которых следует установить привязку. Дополнительные 
    // сведения см. в статье http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "Id,Email,EmailConfirmed,PasswordHash,SecurityStamp,PhoneNumber,PhoneNumberConfirmed,TwoFactorEnabled,LockoutEndDateUtc,LockoutEnabled,AccessFailedCount,UserName,Roles")] ApplicationUser applicationUser) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(applicationUser).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(applicationUser); 
    } 

et vue:

<div class="form-group"> 
     @Html.LabelFor(model => model.Roles, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownListFor(x => x.Roles, (IEnumerable<SelectListItem>)ViewBag.Roles, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.Roles, "", new { @class = "text-danger" }) 
     </div> 
    </div> 
+0

De votre code, il semble que vous publiez la classe User (à partir de Identity Framework). Je ne le recommanderais pas. Utilisez plutôt ViewModels et n'envoyez pas de champs critiques. Je ne veux pas que les clients puissent mettre à jour le PasswordHash. Dans votre viewmodel, vous pouvez ajouter une collection roleId avec juste le roleid. Dans votre méthode Edit, vous pouvez mettre à jour votre modèle d'identité. –

Répondre

0

Essayez de définir un point de rupture juste après la if (ModelState.IsValid) dans l'ouverture { pour voir vraiment ce qui manque le problème est avec une autre propriété que vous n'avez pas défini? Il se peut qu'il y ait une propriété requise dans l'objet ApplicationUser qui n'est pas définie ou que le type de données ne soit pas correct.

+0

Comment obtenir toutes les erreurs de Asp.Net mvc modelstate: http://stackoverflow.com/questions/1352948/how-to-get-all-errors-from-asp-net-mvc-modelstate –