注册用户实体框架时如何纠正异常
Posted
技术标签:
【中文标题】注册用户实体框架时如何纠正异常【英文标题】:How to correct exception when registering user entity framework 【发布时间】:2015-10-08 19:28:38 【问题描述】:我正在尝试将角色添加到我的默认 mvc6 项目中。我在我的 注册.cshtml
@model TransparentEnergy.Models.RegisterViewModel
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h2>Register New User</h2>
</div>
<div class="card-body card-padding">
@using (Html.BeginForm("Register", "Account", FormMethod.Post, new @class = "form-horizontal", role = "form" ))
@Html.AntiForgeryToken()
@Html.ValidationSummary("", new @class = "text-danger" )
<div class="card-body card-padding">
<div class="form-group">
<label for="Email" class="col-sm-2 control-label">Email</label>
<div class="col-sm-10">
<div class="fg-line">
@Html.TextBoxFor(m => m.Email, new @class = "form-control fg-input" )
</div>
</div>
</div>
<div class="form-group">
<label for="Password" class="col-sm-2 control-label">Password</label>
<div class="col-sm-10">
<div class="fg-line">
@Html.PasswordFor(m => m.Password, new @class = "form-control fg-input" )
</div>
</div>
</div>
<div class="form-group">
<label for="ConfirmPassword" class="col-sm-2 control-label">Confirm Password</label>
<div class="col-sm-10">
<div class="fg-line">
@Html.PasswordFor(m => m.ConfirmPassword, new @class = "form-control fg-input" )
</div>
</div>
</div>
<div class="form-group">
<label for="Name" class="col-sm-2 control-label">Role Type</label>
<div class="col-sm-10">
<div class="fg-line select">
@Html.DropDownList("Name", null, new @class = "form-control selectpicker")
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary btn-lg">Register</button>
</div>
</div>
</div>
@section Scripts
@Scripts.Render("~/bundles/jqueryval")
</div>
</div>
错误信息是
具有键“名称”的 ViewData 项属于“System.String”类型,但必须属于“IEnumerable”类型。
帐户控制器
// GET: /Account/Register
[AllowAnonymous]
public ActionResult Register()
ViewBag.Name = new SelectList(context.Roles.ToList(), "Name", "Name");
return View();
//
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
if (ModelState.IsValid)
var user = new ApplicationUser UserName = model.Email, Email = model.Email ;
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
//Assign Role to user Here
await this.UserManager.AddToRoleAsync(user.Id, model.Name);
//Ends Here
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
return RedirectToAction("Index", "Home");
AddErrors(result);
// If we got this far, something failed, redisplay form
return View(model);
注册视图模型
public class RegisterViewModel
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email get; set;
[Required]
[Display(Name = "Full Name")]
public string FullName get; set;
[Required]
[Display(Name = "Role")]
public string Name get; set;
【问题讨论】:
您不能为字符串属性创建下拉列表,它必须是 IEnumerable 类型。它在您插入的异常文本中字面意思。你想做什么?你期待什么结果? 事情是我遵循一个似乎适用于许多人的例子。我正在尝试实现用户角色。当我注册用户时,我想要一个可供选择的角色框。选择框正在显示它们,但提交时出现错误。这是示例 dotnetcurry.com/aspnet-mvc/1102/aspnet-mvc-role-based-security 这是你的全部观点吗? 刚刚更新。谢谢 【参考方案1】:您的视图模型:
public class RegisterViewModel
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email get; set;
[Required]
[Display(Name = "Full Name")]
public string FullName get; set;
[Required]
[Display(Name = "Role")]
public string Name get; set;
//store roles
public IEnumerable<Role> Roles get;set;
您的 GET 控制器:
[AllowAnonymous]
public ActionResult Register()
RegisterViewModel model = new RegisterViewModel();
//Controller should not intervene with presentation logic
//so SelectList is not used here
model.Roles = context.Roles.ToList();
return View(model);
最后你的观点,改变:
@Html.DropDownList("Name", null, new @class = "form-control selectpicker")
收件人:
@Html.DropDownListFor(m => m.Name,
new SelectList(Model.Roles, "Name", "Name"),
new @class = "form-control selectpicker")
更新: 您的 POST 控制器:
model.Roles = context.Roles.ToList();
// If we got this far, something failed, redisplay form
return View(model);
【讨论】:
第 46 行:@Html.DropDownListFor(m => m.Name, 数据验证失败时出现此错误对吧?例如。当电子邮件为空白并且您单击注册按钮时。如果是这种情况,则需要在返回视图之前在 post 控制器中再次填充角色 答案已更新。以上是关于注册用户实体框架时如何纠正异常的主要内容,如果未能解决你的问题,请参考以下文章