MVC远程验证(唯一的电子邮件地址)

时间:2014-02-05 16:28:01

标签: c# asp.net-mvc email-validation account

我目前正在处理用户输入其电子邮件地址的注册页面。 我希望每封电子邮件都是独一无二的。

这是我的RegisterModel的一部分:

    [Required()]
    [System.Web.Mvc.Remote("IsUserEmailAvailable", "Account")]
    [EmailAddress()]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email")]
    public string Email { get; set; }

...

这是我的帐户控制器的一部分:

    public JsonResult IsUserEmailAvailable(string UserEmail)
    {
        return Json(!db.UserProfiles.Any(User => User.UserName == UserEmail),       JsonRequestBehavior.AllowGet);
    }

这是我的观点:

<script src="~/Scripts/jquery-1.7.1.min.js" type="text/javascript"></script>
<script src="~/Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>


<hgroup class="title">
    <h1>Create Account</h1>
</hgroup>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    <fieldset>
        <legend>Registration Form</legend>
        <ol>
            <li>
                @Html.LabelFor(m => m.UserName)
                @Html.TextBoxFor(m => m.UserName)
            </li>
            <li>
                @Html.LabelFor(m => m.Password)
                @Html.PasswordFor(m => m.Password)
            </li>
            <li>
                @Html.LabelFor(m => m.ConfirmPassword)
                @Html.PasswordFor(m => m.ConfirmPassword)
            </li>
            <li>
                @Html.LabelFor(m => m.Email)
                @Html.TextBoxFor(m => m.Email)
            </li>
            <li>
                @Html.LabelFor(m => m.ConfirmEmail)
                @Html.TextBoxFor(m => m.ConfirmEmail)
            </li>
        </ol>
        <input type="submit" value="Registrera" />
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

如果我删除[System.Web.Mvc.Remote(“IsUserEmailAvailable”,“Account”)],一切都很好,除了emailaddress不会是唯一的。有了它,当我按下提交时,没有任何反应。

我错过了什么吗?

3 个答案:

答案 0 :(得分:0)

[Remote]属性非常有限,并且要求属性的名称与控制器操作中的参数名称相同。

  • 您的财产名称为Email,与public string Email { get; set; }

  • 相同
  • 您的操作有一个名为UserEmail的参数,如IsUserEmailAvailable(string UserEmail)

这不起作用,因为远程验证最终会发送一个验证字段的请求,如:

Account/IsUserEmailAvailable?Email=foo

其中Email是该属性的名称。实际上,它是渲染的html输入字段的name属性。这可能是嵌套模型的问题,其中名称将类似于NestedModel.Email,但幸运的是,它不是您的情况。 (参见例如this question

因此,您的验证方法是将 UserEmail 作为null接收(因为请求包含名为 Email 的单个参数),这可能导致请求失败。 (您是否在浏览器中检查了控制台以查看ajax请求是否失败?)

由于两个名称都匹配,您可以更新控制器操作,以便参数名为电子邮件

public JsonResult IsUserEmailAvailable(string Email)
{
    ...
}

希望它有所帮助!

答案 1 :(得分:0)

您可以设置MVC控制器操作并使用jquery即时查询它。这篇文章解释了如何做到这一点(建议它是一个自动完成的文本框,但理论是相同的):How Do I Create an Auto-Complete TextBox?

我很想看到你提出的解决方案来完成这项任务。

答案 2 :(得分:0)

@Daniel J.G.是正确的。将[AllowAnonymous]添加到该函数使其可以访问。