Проверка в ASP.NET MVC 2

У меня есть некоторые проблемы с проверкой с использованием аннотаций к данным в ASP.NET MVC 2. Например, у меня есть класс Address:

public class Address
{
    public long Id { get; set; }

    [Required]
    public string City { get; set; }

    [Required]
    public string PostalCode { get; set; }

    [Required]
    public string Street { get; set; }
}

И класс заказа:

public class Order
{
    public long Id { get; set; }

    public Address FirstAddress { get; set; }

    public Address SecondAddress { get; set; }

    public bool RequireSecondAddress { get; set; }
}

Я хочу проверять Order.FirstAddress все время, но Order.SecondAddress должен проверяться, только если для Order.RequireSecondAddress установлено значение true.

Любые идеи? :)

Крис


person Chris    schedule 30.09.2010    source источник


Ответы (2)


Это почти невозможно с использованием аннотаций к данным, иначе потребуется написать уродливый код, основанный на отражении и т. Д. (Я думаю, вы поняли).

Я бы порекомендовал вам ознакомиться с FluentValidation. У него хорошая интеграция с ASP.NET MVC. Вот как может выглядеть ваша логика проверки:

public class AddressValidator : AbstractValidator<Address>
{
    public AddressValidator()
    {
        RuleFor(x => x.City)
            .NotEmpty();
        RuleFor(x => x.PostalCode)
            .NotEmpty();
        RuleFor(x => x.Street)
            .NotEmpty();
    }
}

public class OrderValidator : AbstractValidator<Order>
{
    public OrderValidator()
    {
        RuleFor(x => x.FirstAddress)
            .SetValidator(new AddressValidator());
        RuleFor(x => x.SecondAddress)
            .SetValidator(new AddressValidator())
            .When(x => x.RequireSecondAddress);
    }
}

Вам также будет полезно иметь отдельный уровень проверки, который также может быть очень элегантно протестирован.

person Darin Dimitrov    schedule 30.09.2010
comment
В FluentValidator есть некоторые проблемы на стороне клиента с более сложными проверками, но я думаю, что это не большая проблема. Теперь я собираюсь узнать больше о FluentValidator :) Спасибо! - person Chris; 30.09.2010

Следующие статьи об условной проверке могут помочь:

person KMån    schedule 30.09.2010
comment
Спасибо! Это то, что я искал. - person Chris; 30.09.2010