ModelState.IsValid vs IValidateableObject dans MVC3
donc, selon Gu IValidatableObject.Validate()
devrait être appelé lorsqu'un contrôleur pour valider le modèle (c'est à dire avant ModelState.IsValid
) mais simplement de rendre le modèle de mettre en œuvre IValidatableObject
ne semble pas fonctionner, car Validate(..)
n'est pas appelée.
Ce que quelqu'un sait si il y a quelque chose d'autre que j'ai pour fils jusqu'à obtenir que cela fonctionne?
EDIT:
Voici le code tel que demandé.
public class LoginModel : IValidatableObject
{
[Required]
[Description("Email Address")]
public string Email { get; set; }
[Required]
[Description("Password")]
[DataType(DataType.Password)]
public string Password { get; set; }
[DisplayName("Remember Me")]
public bool RememberMe { get; set; }
public int UserPk { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var result = DataContext.Fetch( db => {
var user = db.Users.FirstOrDefault(u => u.Email == Email);
if (user == null) return new ValidationResult("That email address doesn't exist.");
if (user.Password != User.CreateHash(Password, user.Salt)) return new ValidationResult("The password supplied is incorrect.");
UserPk = user.UserPk;
return null;
});
return new List<ValidationResult>(){ result };
}
}
L'action. ( Je ne fais rien de spécial dans le Contrôleur...)
[HttpPost]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
FormsAuthentication.SetAuthCookie(model.Email, model.RememberMe);
return Redirect(Request.UrlReferrer.AbsolutePath);
}
if (ControllerContext.IsChildAction || Request.IsAjaxRequest())
return View("LoginForm", model);
return View(model);
}
J'ai mis un point d'arrêt sur la première ligne de LoginModel.Validate()
et il ne semble pas se faire frapper.
source d'informationauteur Master Morality
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas quelque chose de plus que vous avez juste à ajouter au modèle de validation. Voici un exemple de validation
Et votre contrôleur serait d'utiliser ce modèle
Espère que cette aide. D'autres exigences sont .net 4 et annotations de données - ce qui vous aurez évidemment besoin juste pour ivalidatableobjet. Post tous les problèmes et nous allons voir si nous ne pouvons pas les résoudre - comme poster votre modèle et votre contrôleur...vous avez peut-être raté quelque chose.
De Validation à l'aide de la DefaultModelBinder est un processus en deux étapes. Tout d'abord,
Data Annotations
sont validés. Ensuite (et seulement si les annotations de données de validation ont abouti à zéro des erreurs),IValidatableObject.Validate()
est appelé. Tout cela se déroule automatiquement lorsque votre post action a un viewmodel paramètre.ModelState.IsValid
ne pas faire quoi que ce soit. Plutôt juste savoir si n'importe quel élément dans laModelState
collection non videModelErrorCollection
.