2009-07-25 13 views
0

Wenn ich ein 'Model' -Objekt (wie von LinqToSQL generiert) an einen Controller, kann ich 'ModelState.IsValid' abfragen, und wenn es Validierung Attribute auf einer von die Eigenschaften und der Wert wird nicht validiert, wird auf 'false' gesetzt.Validierung funktioniert nicht mit einfachen Objekten in ASP.NET MVC

Allerdings scheint ModelState.IsValid immer "true" zurückzugeben, wenn ich ein benutzerdefiniertes Objekt meiner eigenen Klasse posten, selbst wenn die Eigenschaften dieser Klasse über Validierungsattribute verfügen und falsche Werte erhalten.

Warum funktioniert das nur mit DataContext-Modellobjekten? Was ist mit diesen Objekten, die sie mit ModelState.IsValid arbeiten lassen, während normale Klassen nicht?

Wie kann ich es mit normalen Klassen arbeiten lassen?


Controller-Code:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult LogIn(MyProject.Website.ViewModels.Shared.LogIn model) 
{ 
    if (ModelState.IsValid) 
     return View(model); 

    // ... code to log in the user 
} 

Ansichtsmodell Code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 
using MyProject.Website.Validators; 
using System.ComponentModel; 

public class LogIn 
{ 

    public LogInModes LogInMode { get; set; } 

    [Required] 
    [EmailAddress] 
    public string EmailAddress { get; set; } 

    public string Password { get; set; } 

    public bool RememberMe { get; set; } 

    public string ReturnUrl { get; set; } 

} 
+1

Ich vermute, es ist nicht das Framework, aber ohne ein wenig Code ist es schwer zu sagen, was das Problem ist. – tvanfosson

Antwort

1

Haben Sie DataAnnotationsModelBinder als Standard-Modellbinder in Application_Start Ereignis Ihrer Global.asax Datei so eingestellt?

protected void Application_Start() { 
    ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder(); 
} 

becasue soweit ich weiß, die Attribute unter System.ComponentModel.DataAnnotations namescape nur mit diesem Modell Binder arbeiten.

Sie können auch Ihr Modell Binder nur für diese Aktion gesetzt:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult LogIn([ModelBinder(typeof(DataAnnotationsModelBinder))] 
    Yieldbroker.Website.ViewModels.Shared.LogIn model) { 
    //... 
} 

this blog post Sehen und dieses question.

0

Sollten Sie nicht nur versuchen, wenn (model.IsValid()) ??

EDIT: Sorry, dass Login-Klasse von etwas wie Model erben würde.

Verwandte Themen