我有一个使用两个自定义远程验证器的 MVC4 注册表单。第一个验证器检查电子邮件的唯一性,并正常工作。第二个检查凭证代码的使用次数。输入凭证代码后,它会正确显示一条消息,但在提交时无法接受自定义远程验证。
换句话说,您可以输入优惠券代码并看到来自远程验证器的“无法使用优惠券...”消息。但是您仍然可以提交表单。
这是表单的缩写标记,只有相关字段和提交按钮。完整的表格要大得多。本示例中保留了成功使用自定义验证的电子邮件字段以供比较。您可以在表单末尾附近看到 RegistrationVoucherCode 字段和验证器。
@using (Html.BeginForm("Index", "Registration", FormMethod.Post))
{
<div class="row">
<div class="col-lg-6 col-md-6 col-xs-6 field_wrapper">
<div class="form_label">@Html.LabelFor(m => m.EmailAddress)</div>
<div class="form_field">@Html.TextBoxFor(m => m.EmailAddress)</div>
<div class="form_validator">@Html.ValidationMessageFor(m => m.EmailAddress)</div>
</div>
<div class="col-lg-6 col-md-6 col-xs-6 field_wrapper">
<div class="form_label">Confirm Email</div>
<div class="form_field">@Html.TextBoxFor(m => m.ConfirmEmail)</div>
<div class="form_validator">@Html.ValidationMessageFor(m => m.ConfirmEmail)</div>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-md-6 col-xs-6 field_wrapper">
<div class="form_label">@Html.LabelFor(m => m.RegistrationVoucherCode)</div>
@{
string displayVoucherCode = Model.RegistrationVoucherCode.ToString();
if (Model.RegistrationVoucherCode == 0)
{
displayVoucherCode = string.Empty;
}
}
<div class="form_field">@Html.TextBoxFor(m => m.RegistrationVoucherCode, new { Value = displayVoucherCode, maxlength = 7 })</div>
<div class="form_validator">@Html.ValidationMessageFor(m => m.RegistrationVoucherCode)</div>
</div>
<div class="col-lg-6 col-md-6 col-xs-6 field_wrapper">
</div>
</div>
<div class="row">
<div class="col-xs-12">
<input type="submit" id="submitForm" value="Next" class="standard_button right_button" />
</div>
</div>
}
这是来自我的 ProfileModel 的相关代码。完整的模型要大得多,所以这里只给出相关代码。最后,您可以看到 RegistrationVoucherCode。
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
namespace SW.CEA.WebSite.Models.Registration
{
public class ProfileModel
{
public ProfileModel()
{
}
public Profile Profile { get; set; }
[Required(ErrorMessage = "Confirm Email is required.")]
[Display(Name = "Confirm Email")]
[StringLength(128)]
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Confirm Email Address is Not Valid")]
[System.Web.Mvc.Compare("EmailAddress", ErrorMessage = "Email addresses do not match..")]
public string ConfirmEmail
{
get
{
return Profile.ConfirmEmail;
}
set
{
Profile.ConfirmEmail = value;
}
}
[Required(ErrorMessage = "Email Address is required.")]
[Display(Name = "Email")]
[StringLength(128)]
[Remote("ValidateEmailUniqueness", "Registration")]
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Email Address is Not Valid")]
public string EmailAddress
{
get
{
return Profile.EmailAddress;
}
set
{
Profile.EmailAddress = value;
}
}
[Required(ErrorMessage = "Order Code is required.")]
[Display(Name = "Order Code")]
[Remote("ValidateVoucherCode", "Registration")]
public int RegistrationVoucherCode
{
get
{
return Profile.RegistrationVoucherCode;
}
set
{
Profile.RegistrationVoucherCode = value;
}
}
}
}
这些是来自我的 RegistrationController 的自定义验证器。同样,电子邮件地址验证器出现在此处以进行比较。我的问题是在提交表单时强制执行 ValidateVoucherCode 自定义验证器。
private bool IsEmailUnique(string EmailAddress)
{
var profile = ProfileRepository.GetProfile(EmailAddress);
return (profile == null);
}
[HttpGet]
public JsonResult ValidateEmailUniqueness(string EmailAddress)
{
if (!IsEmailUnique(EmailAddress))
{
return Json("Error, email address is already registered, please sign in.", JsonRequestBehavior.AllowGet);
}
return Json(true, JsonRequestBehavior.AllowGet);
}
[HttpGet]
public JsonResult ValidateVoucherCode(int RegistrationVoucherCode)
{
var voucher = VoucherRepository.GetVoucherWithProfiles(RegistrationVoucherCode);
if (voucher == null)
{
return Json("Invalid Order Code", JsonRequestBehavior.AllowGet);
}
if (voucher.Profiles.Count >= Settings.Default.MaxVoucherUses)
{
return Json("Cannot user voucher, will exceed maximum number of voucher uses.", JsonRequestBehavior.AllowGet);
}
return Json(true, JsonRequestBehavior.AllowGet);
}
当输入过度使用的验证码时,消息“无法使用凭证,将超过凭证使用的最大数量”将成功显示在此 ValidationMessageFor 中的客户端上。这又来自表格。
@Html.TextBoxFor(m => m.RegistrationVoucherCode, new { Value = displayVoucherCode, maxlength = 7 })
@Html.ValidationMessageFor(m => m.RegistrationVoucherCode)
关闭表单字段后,调试器显示此远程验证器被命中。
[HttpGet]
public JsonResult ValidateVoucherCode(int RegistrationVoucherCode)
所以 ValidateVoucherCode 自定义验证器正在完成它的部分工作。当我关闭该字段时,它显示“无法使用凭证...”消息。但这并不妨碍表单被提交。相比之下,同一表单上的唯一电子邮件地址验证器将阻止表单提交。我需要 RegistrationVoucherCode 验证器以相同的方式操作。谢谢你的帮助。