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

Posted

技术标签:

【中文标题】MVC 远程验证(唯一的电子邮件地址)【英文标题】:MVC Remote validation (unique email address) 【发布时间】:2014-03-02 05:05:39 【问题描述】:

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

这是我的 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")] 一切都很好,除了电子邮件地址不会是唯一的。有了它,当我按下提交时,什么也没有发生。

我错过了什么吗?

【问题讨论】:

你能展示一下你的观点吗?你可能错过了显示验证错误 Html.ValidationMessageFor 尝试添加 html.ValidationMesageFor 您的电子邮件 【参考方案1】:

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

【讨论】:

是的,谢谢先生,现在可以使用了。愚蠢的我。我有一个全局过滤器 filters.Add(new System.Web.Mvc.AuthorizeAttribute());【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

您的资源被命名为Email,如public string Email get; set;

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

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

Account/IsUserEmailAvailable?Email=foo

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

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

由于两个名称应该匹配,您可以更新您的控制器操作,以便将参数命名为 Email

public JsonResult IsUserEmailAvailable(string Email)

    ...

希望对你有帮助!

【讨论】:

我已经编辑了我的操作: public JsonResult IsUserEmailAvailable(string Email) return Json(!db.UserProfiles.Any(User => User.Email == Email), JsonRequestBehavior.AllowGet); 同样在这里,什么也没有发生。它也没有说任何关于 ajax 请求的内容,一切都是空白的。 这是来自 chrome 中的网络选项卡:位置:/Account/Login?ReturnUrl=%2fAccount%2fIsEmailAvailable%3fEmail%3dmyslex%2540gmail.com&Email=myslex%40gmail.com [18:36:12 ] 请求地址:localhost:60576/Account/… 请求方法:GET 状态码:302 找到 另外,在我的 AccountModel 中,我无法使用 System.Web.Mvc 包含命名空间;我其他行上的 [Compare] 属性变为红色,并显示“无法找到命名空间 blablabla”,因此我将它包含在您现在看到的远程属性之前的一行中。感谢您的所有帮助 查看 url /Account/Login?ReturnUrl=%2fAccount%2fIsEmailAvailable%3fEmail%3dmyslex%2540gmai‌​l.com&amp;Email=myslex%40gmail.com 会不会是您的验证方法在需要对用户进行身份验证的控制器中?因为响应是将用户重定向到登录页面... 当我尝试从电子邮件文本框中注册一个新用户和标签时,它永远不会到达调试器中的操作方法

以上是关于MVC 远程验证(唯一的电子邮件地址)的主要内容,如果未能解决你的问题,请参考以下文章

远程验证在 ASP.NET MVC 5 中不起作用

Java / Spring MVC 3 验证电子邮件地址

C# MVC 4 应用程序中的电子邮件地址验证:使用或不使用正则表达式 [重复]

如何在接受多个电子邮件地址的字段上实现 MVC 不显眼的验证

如何远程验证电子邮件或检查电子邮件是不是存在

ASP.Net MVC 5 Sending Email 错误:根据验证程序,远程证书无效