ASP.NET MVC 4、Internet 应用程序模板、SimpleMembership - 帐户模型 - 强制执行唯一的用户名和电子邮件

Posted

技术标签:

【中文标题】ASP.NET MVC 4、Internet 应用程序模板、SimpleMembership - 帐户模型 - 强制执行唯一的用户名和电子邮件【英文标题】:ASP.NET MVC 4, Internet Application Template, SimpleMembership - Account Model - enforce unique Username and Email 【发布时间】:2013-04-08 02:10:46 【问题描述】:

如果您在 Visual Studio 2012 Express 中创建一个新的 ASP.net MVC 4 应用程序 - 并选择 Internet 应用程序模板 - 它会为您创建一个帐户模型来管理用户。

开箱即用,用户可以使用唯一的用户名和密码注册和登录。

您还可以将用户名更改为其他名称 - 例如电子邮件地址。

但是,要求用户输入唯一的用户名和电子邮件是很常见的。

如何更改开箱即用的功能来检查这一点?除了服务器端,客户端检查更可取。

我使用 Code First - 所以不想手动更改数据库和 SQL Server 2012 Express。

谢谢。

【问题讨论】:

令人沮丧的是,使用 Web 表单和 SQL Server 存储过程来实现它是微不足道的。显然 MVC 是进步 ;).... 【参考方案1】:

如果您使用的是开箱即​​用的模板,您不必担心UsernameWebSecurity 会确保其独一无二。至于Email,这是我在我目前正在开发的 Web 应用程序中所做的。

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Register(RegisterModel model)
    
        if (ModelState.IsValid)
        
            // Attempt to register the user
            using (EfDb db = new EfDb())
            
                UserProfile userEmail = db.UserProfiles.FirstOrDefault(u => u.Email.ToLower() == model.Email.ToLower());
                try
                
                    // Check if email already exists
                    if (userEmail == null)
                    
                        var token = WebSecurity.CreateUserAndAccount(
                            model.UserName,
                            model.Password,
                                new
                                    
                                        model.Email                                           
                                    ,
                            true);
                        
                    ModelState.AddModelError("", ErrorCodeToString(MembershipCreateStatus.DuplicateEmail));
                
                catch (MembershipCreateUserException e)
                
                    ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
                
            
        
        // If we got this far, something failed, redisplay form
        return View(model);
    

如您所见,这里的数据库与验证无关。 C# 代码负责处理它。只要确保在您的 ViewModel 中有这个:

    [EmailAddress]
    [Required]
    [Display(Name = "Email")]
    public string Email  get; set; 

在视图中

    <div class="editor-label">
        @html.LabelFor(model => model.UserName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.UserName)
        @Html.ValidationMessageFor(model => model.UserName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Email)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Email)
        @Html.ValidationMessageFor(model => model.Email)
    </div>

【讨论】:

这真的很有帮助,谢谢 - 我对 MVC 还很陌生。下一个明显的问题 - 用户如何使用电子邮件和密码登录? ;)。或者更好的是用户名或电子邮件 - 和密码? 这看起来很有趣:***.com/questions/12404438/… @user2254951 如果您希望您的用户使用电子邮件地址登录,最简单的方法是使用带有[EmailAddress] 注释的Username 属性。这样,您就不需要 Email 属性。保持命名不变。另外,如果此答案解决了您的问题,请接受。 @user2254951 或者您可以在该链接中进行操作,但我还有其他一些想法可以尝试。如果您在另一个问题中提出这个问题会更好,所以我们可以尝试一些事情。 @Komengem:ModelState.AddModelError("", ErrorCodeToString(MembershipCreateStatus.DuplicateEmail)); 不应该在else 块中吗?在您的情况下,它将始终运行 - 无论电子邮件是否重复。【参考方案2】:

我认为没有办法“自动”执行此操作。在您的帐户控制器中,在插入新用户名(创建新帐户)之前,您必须检查提交的新用户名是否已存在于数据库中,并在数据库中找到用户名时向视图发送适当的错误消息。

使用一些 javascript/jQuery,您可以实现“客户端”检查,这实际上会在后台(ajax 请求)向服务器提交新用户名,以检查并显示错误,或者继续提交其余的形式取决于结果。

【讨论】:

以上是关于ASP.NET MVC 4、Internet 应用程序模板、SimpleMembership - 帐户模型 - 强制执行唯一的用户名和电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

asp.net MVC 4 0x80070005 - Javascript 运行时错误:访问被拒绝

Telerik asp.net mvc datepicker Internet Explorer (IE) 8 中的“无效参数”

部署 ASP.Net MVC 应用程序

Internet Explorer 缓存 asp.net mvc ajax 结果

带有通用提供程序的 ASP.NET MVC 4 中的错误

ASP.NET MVC Razor Url.Action 在 Internet Explorer 8 中不起作用