当我使用动态下拉列表时角色 ID 不存在
Role ID does not exist when i using dynamic dropdown list
我用这段代码创建了一个动态下拉列表:
[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>
当我 select 注册角色时显示此错误:
用户是在 table 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);
}
AFAIK,AddToRoleAsync
方法需要 2 个输入参数:用户 ID 和角色名称作为字符串,而不是角色 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
作为角色分配的角色名称值。
参考文献:
UserManagement.AddToRoleAsync = https://msdn.microsoft.com/en-us/library/dn497537(v=vs.108).aspx
选择列表 = https://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.118).aspx
我用这段代码创建了一个动态下拉列表:
[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>
当我 select 注册角色时显示此错误:
用户是在 table 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);
}
AFAIK,AddToRoleAsync
方法需要 2 个输入参数:用户 ID 和角色名称作为字符串,而不是角色 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
作为角色分配的角色名称值。
参考文献:
UserManagement.AddToRoleAsync = https://msdn.microsoft.com/en-us/library/dn497537(v=vs.108).aspx
选择列表 = https://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.118).aspx