Das Projekt:Alles ist vorhanden, aber die Validierung nicht funktioniert
- ASP.NET 4.5.2
- MVC 5
- Fluent Validation
- Keine DB, kein Back-End-
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>
Modell:
[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; }
}
Validator:
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 “123-456-7890”")
.Matches(@"^\d{3}-\d{3}-\d{4}$").WithMessage("Phone number must be a valid 10-digit phone number with dashes, in the form of “123-456-7890”");
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.");
}
}
Controller:
[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);
}
Ausblick:
@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"> </label><button type="submit" value="Save" title="Save" class="btn btn-primary glyphicon glyphicon-send"></button>
</fieldset>
}
Layout-Ansicht:
<!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 © @DateTime.Now.Year - Lawyer Case.<br />Site Design & Development © @DateTime.Now.Year - Eclipse Computing Ltd.</p>
</footer>
@RenderSection("scripts", required: false)
</body>
</html>
Es spielt keine Rolle, wo ich die @Scripts.Render("~/bundles/jqueryval")
setzen, Validierung nicht entweder für clientseitige OR serverseitige arbeitet. Nur ein wenig verwirrt hier ...
Wenn ich auf dem Formular klicken Sie auf „Eintragen“ nur ohne es zu füllen an alle aus, es sollte zurückkehren mich auf die Kontaktseite und Form, weil ModelState.IsValid
SOLLTENfalse
sein , aber anscheinend ist es nicht - ich erhalte stattdessen die Indexseite, die mir sagt, dass Validierung nicht richtig validiert, weil das Formular noch ModelState.IsValid = true
leer ist. Warum, ich weiß es nicht.
Haben Sie sorgen dafür, dass es verkabeln über 'FluentValidationModelValidatorProvider.Configure();'? –
Oooookay ... Könntest du das als Lösung hinzufügen, also kann ich das als die richtige Antwort markieren und dir ein paar Punkte geben? Bitte erwähnen Sie auch, dass es in die Datei Global.asax.cs gehen muss, da ich ein wenig nach dem richtigen Ort suchen musste. Auch - warum wird nicht so shit wie automatisch konfiguriert, wenn Sie ein Paket wie FluentValidation über NuGet bringen? Dies scheint ein Kinderspiel zu sein - wenn Sie das Paket mitbringen, möchten Sie es natürlich verwenden, also konfigurieren wir das Projekt mit einigen grundlegenden Dingen, die benötigt werden, egal wie Sie das Tool implementieren. –