一切都已到位,但验证无效

时间:2016-04-25 20:04:45

标签: 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>

型号:

[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; }
}

验证

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.");
  }
}

控制器:

[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);
}

查看:

@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>
}

布局视图:

<!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>

我放@Scripts.Render("~/bundles/jqueryval")并不重要,验证不适用于客户端 OR 服务器端。这里有点神秘......

如果我只是点击&#34;提交&#34;在表单上没有填写它,它应该将我返回到联系页面和表单,因为ModelState.IsValid 应该 false,但显然不是 - 我正在获取索引页面,这告诉我验证没有正确验证,因为表单是空的ModelState.IsValid = true。为什么,我不知道。

1 个答案:

答案 0 :(得分:5)

根据文档here

您需要配置与MVC的集成 - 通常位于Application_Start()的{​​{1}}

Global.asax.cs