2009-07-25 8 views
0

Lorsque je poste un objet 'Model' (tel que généré par LinqToSQL) sur un contrôleur, je peux interroger 'ModelState.IsValid', et s'il existe des attributs de validation sur l'un des les propriétés et la valeur ne sont pas validées, elles seront définies sur 'false'. Cependant, ModelState.IsValid semble toujours retourner 'true' si je poste un objet personnalisé de ma propre classe, même si les propriétés de cette classe ont des attributs de validation et reçoivent des valeurs incorrectes.La validation ne fonctionne pas sur les objets simples dans ASP.NET MVC

Pourquoi cela ne fonctionne qu'avec les objets de modèle DataContext? Qu'y a-t-il à propos de ces objets qui les font fonctionner avec ModelState.IsValid, contrairement aux classes normales?

Comment puis-je le faire fonctionner avec des classes normales?


Code contrôleur:

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

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

Code ViewModel:

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

Je suppose que ce n'est pas le cadre, mais sans un peu de code, il est difficile de dire quel est le problème. – tvanfosson

Répondre

1

Avez-vous défini DataAnnotationsModelBinder comme classeur par défaut dans l'événement Application_Start de votre fichier Global.asax comme ceci?

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

becasue pour autant que je sache, les attributs sous System.ComponentModel.DataAnnotations namescape uniquement avec ce liant modèle.

Vous pouvez également définir votre classeur modèle uniquement pour cette action:

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

Voir this blog post et ce question.

0

pas Si vous essayez juste si (model.IsValid()) ??

EDIT: Désolé, il faudrait une classe de connexion héritant de quelque chose comme Model.