2

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

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

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

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

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

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

谢谢。

4

2 回答 2

3

如果您使用的是开箱即​​用的模板,您不必担心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>
于 2013-04-08T05:03:06.760 回答
0

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

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

于 2013-04-08T02:23:18.913 回答