嗨那里)我是一个asp新手,我正在实现基于角色的安全性在我的项目中,使用ApplicationUsers类。所以我创建了页面,其中管理员可以为用户设置角色,但我无法为用户设置另一个角色,因为在编辑发布方法中,ModelState.IsValid值为false,因为它无法将字符串id值转换为角色。我试着给ModelState设置值,但我不能,因为它没有setter。请帮助,我怎样才能以另一种方式修复它? 我下面的代码...Asp设置角色ModelState.IsValid是假
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);
}
和看法:
<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>
从你的代码看起来你正在发布User类(来自Identity Framework)。我不会推荐这个。改为使用ViewModel,不要发送关键字段。我不希望客户能够更新PasswordHash。在你的viewmodel中,你可以添加一个只有roleid的角色集合。在您的编辑方法中,您可以更新您的标识模型。 –