Forms MVC4自定义远程验证程序消息出现,但在表单提交时被忽略

Forms MVC4自定义远程验证程序消息出现,但在表单提交时被忽略,forms,validation,asp.net-mvc-4,remote-validation,Forms,Validation,Asp.net Mvc 4,Remote Validation,我有一个MVC4注册表,它使用了两个定制的远程验证器。第一个验证器检查电子邮件的唯一性,并正常工作。第二个检查凭证代码的使用次数。它在输入凭证代码后正确显示消息,但在提交时无法执行自定义远程验证。 换句话说,您可以输入凭证代码,并从远程验证器看到“无法使用凭证…”消息。但你仍然可以提交表格 @using (Html.BeginForm("Index", "Registration", FormMethod.Post)) { <div class="row">

我有一个MVC4注册表,它使用了两个定制的远程验证器。第一个验证器检查电子邮件的唯一性,并正常工作。第二个检查凭证代码的使用次数。它在输入凭证代码后正确显示消息,但在提交时无法执行自定义远程验证。

换句话说,您可以输入凭证代码,并从远程验证器看到“无法使用凭证…”消息。但你仍然可以提交表格

@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>
  }
@Html.TextBoxFor(m => m.RegistrationVoucherCode, new { Value = displayVoucherCode, maxlength = 7 })
@Html.ValidationMessageFor(m => m.RegistrationVoucherCode)
这是表单的缩写标记,只有相关字段和submit按钮。完整的表格要大得多。成功使用自定义验证的电子邮件字段将保留在此示例中以供比较。您可以在表单末尾附近看到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>
  }
@Html.TextBoxFor(m => m.RegistrationVoucherCode, new { Value = displayVoucherCode, maxlength = 7 })
@Html.ValidationMessageFor(m => m.RegistrationVoucherCode)
这些是来自我的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的客户端上成功显示消息“无法使用凭证,将超过凭证使用的最大数量”。这同样是来自表单

@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>
  }
@Html.TextBoxFor(m => m.RegistrationVoucherCode, new { Value = displayVoucherCode, maxlength = 7 })
@Html.ValidationMessageFor(m => m.RegistrationVoucherCode)
当跳出表单字段时,调试器显示这个远程验证程序被命中

[HttpGet]
public JsonResult ValidateVoucherCode(int RegistrationVoucherCode)

所以ValidateVoucherCode自定义验证器正在做它的部分工作。当我在字段外设置选项卡时,它会显示“无法使用凭单…”消息。但它不会阻止表单提交。相反,同一表单上的唯一电子邮件地址验证程序会阻止表单提交。我需要RegistrationVoucherCode验证器以同样的方式运行。感谢您的帮助。

解决方案是将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

jquery.unobtrusive-ajax.min.js、jquery.validate.min.js、jquery.validate.unobtrusive.min.js您是否在cshtml表单中使用上述所有jquery?感谢您的回复@KrunalPatil。我最初使用的脚本是:jquery-2.1.0.min.js、jquery.validate.min.js、jquery.validate.unobtrusive.min.js、bootstrap.min.js.jquery.validate.unobtrusive.min.js是罪魁祸首。但你的问题解决了吗?这很有趣。我的问题解决了,但显然原因不同。如果我将jquery-2.1.0.min.js替换为,那么通过从我的cshtml页面中删除jquery.validate.unobtrusive.min.js,验证工作和我的问题就解决了。但很高兴知道你的问题解决了。快乐编码。!!此外,如果我应用了Google最新的jQuery库,而不是1.7.1版本,它就会开始失败。我敢打赌,这与我电脑上jquery.validate库的本地实例之间的断开连接有关。可能我需要以Microsoft托管的实例为目标,并将它们与我们正在使用的任何版本的jquery关联起来。那些图书馆在这里。就这样。所有版本都需要对应。这一切共同作用。