so nach GuIValidatableObject.Validate()
soll aufgerufen werden, wenn ein Controller-Modell, es ist bestätigt (dh vor ModelState.IsValid
) aber einfach macht das Modell IValidatableObject
implementieren nicht zu funktionieren scheint, weil Validate(..)
nicht genannt Bekommen .ModelState.IsValid vs IValidateableObject in MVC3
Wer weiß, ob es noch etwas gibt, das ich anschließen muss, um das zu funktionieren?
EDIT:
Hier ist der Code wie angefordert.
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 };
}
}
Die Aktion. (Ich mache nichts besonderes im Controller ...)
[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);
}
ich einen Haltepunkt in der ersten Zeile von LoginModel.Validate()
und es scheint nicht getroffen werden.
Ihr Code sieht gut aus. Genau wie es sollte. Nur ein Punkt von Interesse, aber haben Sie ein doppeltes Modell? Ich weiß, dass ich ein Ansichtsmodell und ein DB-Modell für jedes Objekt habe. Könnte Ihr Controller auf das falsche Modell verweisen? – Buildstarted
Auch eine Randnotiz: Sie sollten definitiv nur einen Fehler zurückgeben, wenn der Benutzername oder das Passwort ungültig ist und keine eindeutigen Fehler. Dies dient nur der Sicherheit, da ich jedes Feld einzeln testen kann, um einen Benutzernamen zu finden und dann das Passwort für diesen Benutzer zu bearbeiten. Es ist nicht erforderlich, aber es ist eine gute Idee :) – Buildstarted
Sie könnten 'yield return DataContext ...' anstelle einer neuen Liste verwenden. Es wäre schöner und schneller. – pipedreambomb