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%2540gmail.com&Email=myslex%40gmail.com
会不会是您的验证方法在需要对用户进行身份验证的控制器中?因为响应是将用户重定向到登录页面...
当我尝试从电子邮件文本框中注册一个新用户和标签时,它永远不会到达调试器中的操作方法以上是关于MVC 远程验证(唯一的电子邮件地址)的主要内容,如果未能解决你的问题,请参考以下文章
C# MVC 4 应用程序中的电子邮件地址验证:使用或不使用正则表达式 [重复]