【问题标题】:MVC Remote validation (unique email address)MVC 远程验证(唯一的电子邮件地址)
【发布时间】: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 您的电子邮件

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


【解决方案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 会不会是您的验证方法在需要对用户进行身份验证的控制器中?因为响应是将用户重定向到登录页面...
    • 当我尝试从电子邮件文本框中注册一个新用户和标签时,它永远不会到达调试器中的操作方法
    猜你喜欢
    • 2014-05-23
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2015-01-03
    • 2011-06-08
    • 2014-06-12
    相关资源
    最近更新 更多