将显示MVC4自定义远程验证器消息,但在表单提交时将被忽略

时间:2014-05-02 15:28:54

标签: forms validation asp.net-mvc-4 remote-validation

我有一个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验证器以相同的方式操作。谢谢你的帮助。

1 个答案:

答案 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