0

我有一个使用两个自定义远程验证器的 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 验证器以相同的方式操作。谢谢你的帮助。

4

1 回答 1

0

解决方案是将 jquery-2.1.0.min.js 替换为https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js

我的表单目前使用的脚本是:

https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js
jquery.validate.min.js
jquery.validate.unobtrusive.min.js
于 2014-05-06T12:40:40.937 回答