一切就绪,但验证不起作用

Ren*_*bis 3 asp.net asp.net-mvc asp.net-mvc-5

该项目:

  • ASP.NET 4.5.2
  • MVC 5
  • 流利验证
  • 没有数据库,没有后端

Web.config:

<appSettings>
  <add key="webpages:Version" value="3.0.0.0" />
  <add key="webpages:Enabled" value="false" />
  <add key="ClientValidationEnabled" value="true" />
  <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)

模型:

[Validator(typeof(ContactValidator))]
public class ContactViewModel {
  [DisplayName("Name:")]
  public string Name { get; set; }
  [DisplayName("Phone:")]
  [DataType(DataType.PhoneNumber)]
  public string Phone { get; set; }
  [DisplayName("eMail:")]
  [DataType(DataType.EmailAddress)]
  public string eMail { get; set; }
  [DisplayName("Message:")]
  public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

验证器:

public class ContactValidator : AbstractValidator<ContactViewModel> {
  public ContactValidator() {
    RuleFor(x => x.Name)
      .NotEmpty().WithMessage("Please provide a name.")
      .Length(2, 255).WithMessage("Please provide a name of some substantial length.");
    RuleFor(x => x.Phone)
      .NotEmpty().WithMessage("Please enter a valid 10-digit phone number.")
      .Length(12, 12).WithMessage("Phone number must be in the form of &#8220;123-456-7890&#8221;")
      .Matches(@"^\d{3}-\d{3}-\d{4}$").WithMessage("Phone number must be a valid 10-digit phone number with dashes, in the form of &#8220;123-456-7890&#8221;");
    RuleFor(x => x.eMail)
      .NotNull().WithMessage("Please provide an eMail address.")
      .EmailAddress().WithMessage("Please provide a valid eMail address to recieve the download link at.");
    RuleFor(x => x.Message)
      .NotNull().WithMessage("Please provide a message.")
      .Length(2, 4000).WithMessage("Please provide a message of some substantial length.");
  }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

[HttpGet]
public ActionResult Contact() {
  var model = new ContactViewModel() { };
  return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Contact(ContactViewModel model) {
  if(ModelState.IsValid) {

    return View("Index");
  }
  return View(model);
}
Run Code Online (Sandbox Code Playgroud)

视图:

@using(Html.BeginForm()) {
  @Html.AntiForgeryToken()
  <ul><li>All fields are required.</li></ul>
  <fieldset>
    @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label" })@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control", maxlength = "255" } })
    @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
    @Html.LabelFor(model => model.Phone, htmlAttributes: new { @class = "control-label" })@Html.EditorFor(model => model.Phone, new { htmlAttributes = new { @class = "form-control", maxlength = "12" } })
    @Html.ValidationMessageFor(model => model.Phone, "", new { @class = "text-danger" })
    @Html.LabelFor(model => model.eMail, htmlAttributes: new { @class = "control-label" })@Html.EditorFor(model => model.eMail, new { htmlAttributes = new { @class = "form-control", maxlength = "255" } })
    @Html.ValidationMessageFor(model => model.eMail, "", new { @class = "text-danger" })
    @Html.LabelFor(model => model.Message, htmlAttributes: new { @class = "control-label" })@Html.TextAreaFor(model => model.Message, new { @class = "form-control" })
    @Html.ValidationMessageFor(model => model.Message, "", new { @class = "text-danger" })
    <label class="control-label">&nbsp;</label><button type="submit" value="Save" title="Save" class="btn btn-primary glyphicon glyphicon-send"></button>
  </fieldset>
}
Run Code Online (Sandbox Code Playgroud)

布局视图:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Lawyer Case | @ViewBag.Title</title>
    @Styles.Render("~/Content/bootstrap")
    @Styles.Render("~/Content/lightbox")
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/bootstrap")
    @Scripts.Render("~/bundles/inputmask")
    @Scripts.Render("~/bundles/lightbox")
  </head>
  <body>
    <div class="navbar navbar-blue navbar-fixed-top">
      <div class="container">
    <header class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <h1>@Html.ActionLink("Lawyer Case", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })</h1>
    </header>
    <nav class="navbar-collapse collapse">
      <ul class="nav navbar-nav">
        <li>@Html.ActionLink("Home", "Index")</li>
        <li>@Html.ActionLink("Contact Us", "Contact")</li>
      </ul>
    </nav>
      </div>
    </div>
    <main class="container body-content">
      @RenderBody()
    </main>
    <footer class="container">
      <hr />
      <p>Site Contents &copy; @DateTime.Now.Year - Lawyer Case.<br />Site Design &amp; Development &copy; @DateTime.Now.Year - Eclipse Computing Ltd.</p>
    </footer>
    @RenderSection("scripts", required: false)
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

放在哪里都无所谓@Scripts.Render("~/bundles/jqueryval")对于客户端服务器端验证都不起作用。只是有点神秘而已...

如果我不填写就直接点击表单上的“提交”,它应该使我返回“联系”页面和表单,因为ModelState.IsValid 应该false,但显然不是,而是获取索引页面,这告诉我验证未正确验证,因为该表单为空ModelState.IsValid = true。为什么,我不知道。

ste*_*kil 5

根据此处的文档。

您将需要配置与MVC的集成-通常在Application_Start()您的Global.asax.cs

FluentValidationModelValidatorProvider.Configure();
Run Code Online (Sandbox Code Playgroud)