IValidatableObject не работает в веб-приложении mvc 4
Итак, у меня есть веб-приложение, которое регистрирует пользователей и деловых партнеров.
Вот так выглядят мои модели
public class UserModel : IValidatableObject
{
//here are some properties and methods that I am using in Validate method
public CompanyModel Company { get; set; } //this is user Company
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.UserWithEmailExists())
yield return new ValidationResult("Email already exists", new[] { "Email" });
if (this.UserWithUsernameExists())
yield return new ValidationResult("Username already exists", new[] { "Username" });
}
}
public class CompanyModel : IValidatableObject
{
//again here are some properties that i am using in Validate
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.Phone == null && this.Mobile == null)
yield return new ValidationResult("The Phone field is required", new[] { "Phone" });
}
}
//this is the model passed to the view
public sealed class RegistrationModel : UserModel, IValidatableObject
{
public new IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.Password != this.PasswordValidation)
yield return new ValidationResult("Ponovite prejšnji vnos", new[] { "PasswordValidation" });
}
}
Проблема заключается в следующем: когда я отправляю свою форму, вызывается проверка в CompanyModel и проверка также в RegistrationModel. Но я хочу, чтобы также вызывался Validate в UserModel...
ОБНОВЛЕНИЕ: Я решил первую проблему: это модели после обновления:)
public class UserModel : IValidatableObject
{
//here are some properties and methods that I am using in Validate method
public CompanyModel Company { get; set; } //this is user Company
public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.UserWithEmailExists())
yield return new ValidationResult("Email already exists", new[] { "Email" });
if (this.UserWithUsernameExists())
yield return new ValidationResult("Username already exists", new[] { "Username" });
}
}
public class CompanyModel : IValidatableObject
{
//again here are some properties that i am using in Validate
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.Phone == null && this.Mobile == null)
yield return new ValidationResult("The Phone field is required", new[] { "Phone" });
}
}
//this is the model passed to the view
public sealed class RegistrationModel : UserModel, IValidatableObject
{
public override new IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
//this is needed so that UserModel validation executes
foreach (var result in base.Validate(validationContext))
{
yield return result;
}
if (this.Password != this.PasswordValidation)
yield return new ValidationResult("Ponovite prejšnji vnos", new[] { "PasswordValidation" });
}
}
Теперь проверка работает нормально. Я просто не знаю, почему Validate в CompanyModel выполняется два раза?? Любое предложение?
1 ответ
Когда вы переопределяете метод в базовом классе, метод в этом базовом классе явно не вызывается. Вы должны сделать это самостоятельно, поэтому в Validate
функция в RegistrationModel, добавить вызов Validate
функция в базовом классе UserModel.
base.Validate(validationContext);
Тем не менее, как вы используете yield return
в ваших валидаторах, что делает Validate
Функция итератор, поэтому он должен быть повторен, чтобы все работало правильно. Согласно этому вопросу, полное решение заключается в использовании этого кода в вашем RegistrationModel.Validate
функция:
foreach (var result in base.Validate(validationContext))
{
yield return result;
}