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;
}
Другие вопросы по тегам