Wie in MVC üblich, habe ich eine Ansicht, ein Modell und einen Controller.ModelState.IsValid ist immer wahr
Die Ansicht enthält ein Formular:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.HiddenFor(m => m.Id)
<ul class="fieldlist">
<li>
@Html.LabelFor(m =>m.Email)
@Html.TextBoxFor(m => m.Email)
@Html.ValidationMessageFor(m => m.Email)
</li>
<li>
<div class="row">
<div class="col-md-6">
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)
</div>
<div class="col-md-6">
@Html.LabelFor(m => m.LastName)
@Html.TextBoxFor(m => m.LastName)
@Html.ValidationMessageFor(m => m.LastName)
</div>
</div>
</li>
<li>
@Html.LabelFor(m => m.PhoneNumber)
@Html.TextBoxFor(m => m.PhoneNumber)
@Html.ValidationMessageFor(m => m.PhoneNumber)
</li>
<li>
<div Class="row">
<div Class="col-md-2">
<input type="submit" value="Save" />
</div>
</div>
</li>
</ul>
}
Das Modell sieht wie folgt aus:
public class UserAdminUserViewModel
{
[Display(Name = "User Database ID"), DataType(DataType.Text)]
public string Id { get; set; }
[Display(Name = "Full Name")]
public string Name { get { return FirstName + " " + LastName; } }
[Required()]
[Display(Name = "First Name"), DataType(DataType.Text)]
public string FirstName { get; set; }
[Required()]
[Display(Name = "Last Name"), DataType(DataType.Text)]
public string LastName { get; set; }
[Required()]
[Display(Name = "Email Address"), DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Display(Name = "Telephone Number"), DataType(DataType.Text)]
public string PhoneNumber { get; set; }
}
Und der Controller die Aktualisierungen zu erhalten:
[HttpPost,ValidateAntiForgeryToken]
public ActionResult User(UserAdminUserViewModel model)
{
if (ModelState.IsValid)
{
// do something, apply the updates to the database, presumably
}
return View(model);
}
... aber Model .IsValid ist immer wahr. Der Controller ist empfängt die eingegebenen Informationen, aber es scheint, dass keine Validierung stattfindet. Ich habe versucht:
TryUpdateModel<UserAdminUserViewModel>(model);
und
UpdateModel<UserAdminUserViewModel>(model);
Ich bin nicht sicher, ich sehe, wie diese funktionieren würde, aber sie waren die ersten Vorschläge, die ich zufällig stieß. Kein Würfel. Immer noch gültig unabhängig von den Daten in 'Modell'. Ich habe auch versucht:
System.ComponentModel.DataAnnotations.Validator.ValidateObject(model, new System.ComponentModel.DataAnnotations.ValidationContext(model));
Vielversprechender, aber immer noch nicht funktioniert. Ich habe auch versucht die ausführlichere Ansatz:
System.ComponentModel.DataAnnotations.ValidationContext valContext = new System.ComponentModel.DataAnnotations.ValidationContext(model, null, null);
List<System.ComponentModel.DataAnnotations.ValidationResult> valResults = new List<System.ComponentModel.DataAnnotations.ValidationResult>();
System.ComponentModel.DataAnnotations.Validator.TryValidateObject(model, valContext, valResults, true);
foreach(System.ComponentModel.DataAnnotations.ValidationResult result in valResults)
{
this.ModelState.AddModelError(result.MemberNames.FirstOrDefault() ?? string.Empty, result.ErrorMessage);
}
... die auch nicht funktionierte. 'valResults', die Fehler im Status des Modells enthalten sollten, wird niemals gefüllt. Es findet keine Validierung statt.
Haben Sie Ihre Client-Seite jquery.validate, jquery.unobtrusive und jquery.validate.unobtrusive irgendwo im Bereich zu diesem Formular enthalten? –
Dumm, aber Sie geben auch falsche Daten, um richtig zu testen ?! –
Ich gebe absichtlich eine falsche E-Mail-Adresse ein, ja. – Tom