注册用户实体框架时如何纠正异常

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 控制器中再次填充角色 答案已更新。

以上是关于注册用户实体框架时如何纠正异常的主要内容,如果未能解决你的问题,请参考以下文章

实体框架在使用 Find 方法时抛出异常

如何在使用实体框架时获取所有用户角色

突然从实体框架中获取异常

如何修复实体框架中的“无法确定导航属性表示的关系”错误

在 Toastr 或使用 MVC4 和实体框架的类似方法中显示错误和异常

如何解决实体框架提供程序异常