IValidatableObject не запущен

Я пытаюсь использовать IValidatableObject, как описано здесь http://davidhayden.com/blog/dave/archive/2010/12/31/ASPNETMVC3ValidationIValidatableObject.aspx.

Но он просто не срабатывает, когда я пытаюсь проверить, ModelState.IsValid всегда true.

Вот код моей модели:

[MetadataType(typeof(RegistrationMetaData))]
public partial class Registration : DefaultModel
{
    [Editable(false)]
    [Display(Name = "Property one")]
    public int PropertyOne { get; set; }
}

public class RegistrationMetaData :IValidatableObject
{
    [Required(ErrorMessage = "Customer no. is required.")]
    [Display(Name = "Customer no.")]
    public string CustomerNo { get; set; }

    [Display(Name = "Comments")]
    public string Comments { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (new AccountModel().GetProfile(CustomerNo) == null)
            yield return new ValidationResult("Customer no. is not valid.", new[] { "CustomerNo" });
    }
}

Я расширяю таблицу LINQ to SQL с именем Registration, мое первое предположение заключалось в том, что это невозможно сделать в классе Meta, но я не уверен?

Я не получаю никаких ошибок, и он отлично строится, но метод Validate не срабатывает. Что я пропустил?


person Martin    schedule 21.09.2011    source источник


Ответы (1)


Это потому, что именно модель Registration должна реализовывать IValidatableObject, а не RegistrationMetaData:

[MetadataType(typeof(RegistrationMetaData))]
public partial class Registration : IValidatableObject
{
    [Editable(false)]
    [Display(Name = "Property one")]
    public int PropertyOne { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (new AccountModel().GetProfile(CustomerNo) == null)
            yield return new ValidationResult("Customer no. is not valid.", new[] { "CustomerNo" });
    }
}

public class RegistrationMetaData
{
    [Required(ErrorMessage = "Customer no. is required.")]
    [Display(Name = "Customer no.")]
    public string CustomerNo { get; set; }

    [Display(Name = "Comments")]
    public string Comments { get; set; }
}
person Darin Dimitrov    schedule 21.09.2011
comment
Ладно, думал, что-то в этом роде. Моя проблема в том, что я наследую от DefaultModel к Registration, и, насколько мне известно, я не могу наследовать более чем один класс. Как я могу это решить? - person Martin; 21.09.2011
comment
@Martin, вы можете наследовать от одного класса, но вы можете реализовать столько интерфейсов, сколько захотите. IValidatableObject — это интерфейс. - person Darin Dimitrov; 21.09.2011
comment
Будет ли это работать, даже если я использую его с закрытым закрытым классом, в который я добавляю свои аннотации данных? Причина в том, что сначала это была база данных. - person Vyache; 15.05.2014