我目前正在处理用户输入其电子邮件地址的注册页面。 我希望每封电子邮件都是独一无二的。
这是我的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不会是唯一的。有了它,当我按下提交时,没有任何反应。
我错过了什么吗?
答案 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]添加到该函数使其可以访问。