我有一个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);
}
消息&#34;无法用户凭证,将超过凭证使用的最大数量,&#34;当输入过度使用的验证代码时,将在此ValidationMessageFor中成功显示在客户端上。这再次来自表格。
@Html.TextBoxFor(m => m.RegistrationVoucherCode, new { Value = displayVoucherCode, maxlength = 7 })
@Html.ValidationMessageFor(m => m.RegistrationVoucherCode)
选中表格字段后,调试程序会显示此远程验证程序被点击。
[HttpGet]
public JsonResult ValidateVoucherCode(int RegistrationVoucherCode)
因此,ValidateVoucherCode自定义验证器正在完成其部分工作。它显示了&#34;无法使用优惠券......&#34;当我选中该字段时的消息。但并不能阻止提交表单。相比之下,同一表单上的唯一电子邮件地址验证器会阻止表单提交。我需要RegistrationVoucherCode验证器以相同的方式操作。谢谢你的帮助。
答案 0 :(得分:0)
解决方案是用https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js替换jquery-2.1.0.min.js。
我的表单目前使用的脚本是:
https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js
jquery.validate.min.js
jquery.validate.unobtrusive.min.js