więc według GuIValidatableObject.Validate()
powinien uzyskać wywołana, gdy kontroler sprawdza, to wzór (czyli przed ModelState.IsValid
), jednakże po prostu czyni model wdrożenia IValidatableObject
nie wydają się działać, bo Validate(..)
nie sprawdzony .ModelState.IsValid vs IValidateableObject w MVC3
Ktoś wie, czy jest coś innego, co muszę podłączyć, aby to zadziałało?
EDIT:
Oto kod na żądanie.
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 };
}
}
Akcja. (Nie mam nic specjalnego robić w kontrolerze ...)
[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);
}
ustawić punkt przerwania na pierwszej linii LoginModel.Validate()
i nie wydaje się, aby oberwać.
Twój kod wygląda dobrze. Dokładnie tak, jak powinno. Tylko punkt zainteresowania, ale czy masz zduplikowany model? Wiem, że mam model widoku i model db dla każdego obiektu. Czy Twój kontroler może odwoływać się do niewłaściwego modelu? – Buildstarted
Również na marginesie: z pewnością powinieneś zwrócić tylko jeden błąd, jeśli nazwa użytkownika lub hasło jest nieprawidłowe i nie ma wyraźnych błędów. Jest to po prostu dla bezpieczeństwa, ponieważ mogę przetestować każde pole indywidualnie, aby znaleźć nazwę użytkownika, a następnie pracować nad hasłem dla tego użytkownika. Nie jest to wymagane, ale jest to dobry pomysł :) – Buildstarted
Można użyć 'zwrotu dochodu DataContext ...' zamiast zwracania nowej listy. Byłaby ładniejsza i szybsza. – pipedreambomb