2017-07-07 4 views
0

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.

+1

Haben Sie Ihre Client-Seite jquery.validate, jquery.unobtrusive und jquery.validate.unobtrusive irgendwo im Bereich zu diesem Formular enthalten? –

+0

Dumm, aber Sie geben auch falsche Daten, um richtig zu testen ?! –

+0

Ich gebe absichtlich eine falsche E-Mail-Adresse ein, ja. – Tom

Antwort

1

ich dies für E-Mail-Validierung verwenden würde:

@using using System.ComponentModel.DataAnnotations; 

[Required] 
[EmailAddress] 
[Display(Name = "Email Address")] 
public string Email { get; set; } 

Bitte lesen Sie diesen StackOverflow post

fügt jedoch EmailAddressAttribute serverseitige Validierung auf der dieser. I.e. Es gibt keine serverseitige Validierung, wenn Sie nur DataTypeAttribute verwenden!

+0

[EmailAddress] war die fehlende Komponente, das Hinzufügen des Problems löste das Problem. Vielen Dank. – Tom

0

Wenn das Problem mit falscher E-Mail-Adresse, hier ist die Lösung:

[Email(ErrorMessage = "Invalid Email Address")] 
[Required()] 
[Display(Name = "Email Address"), DataType(DataType.EmailAddress)] 
public string Email { get; set; } 

DataType(DataType.EmailAddress) bedeutet, wie nur Textbox auf Client-Seite zu zeigen, während Email Attribut eigentliche Validierung des Fall ist.

+0

Hinzufügen von [EmailAddress] zu dem E-Mail-Attribut hat den Trick. – Tom