Предотвращение проверки всех свойств внутреннего объекта в MVC - PullRequest
1 голос
/ 22 ноября 2010

Например, у меня есть

public class Person
{
    public int Id {get;set;}
    [Required()]
    public string Name {get;set;}
    [Required()]
    public Address Address {get;set;}
}

И

public class Address
{
    public int Id {get;set;}
    [Required()]
    public string City {get;set;}
    [Required()]
    public string Street {get;set;}
}

Мне нужно проверить каждое свойство в адресе, но при проверке лица мне нужно проверять только идентификатор адреса. Как это сделать ??

1 Ответ

1 голос
/ 22 ноября 2010

Я не знаю, что вы подразумеваете под Мне нужно проверить каждое свойство в адресе, но при проверке лица мне нужно проверять только идентификатор адреса .Поправьте меня, если я ошибаюсь, но вот как я понимаю ваш вопрос: у вас есть два разных действия контроллера:

[HttpPost]
public ActionResult ValidateAddress(Address address)
{
    ... // validate all properties of address
}

[HttpPost]
public ActionResult ValidatePerson(Person person)
{
    ... // validate only the Id of a person's Address
}

Лично я бы использовал FluentValidation вместо аннотаций данных, поскольку это позволяетвыразить свою логику проверки более понятным способом и, среди прочего, обрабатывать подобные случаи.Итак, вот как это можно выразить элегантным образом:

/// <summary>
/// Validates all properties of an address
/// </summary>
public class AddressValidator : AbstractValidator<Address>
{
    public AddressValidator()
    {
        RuleFor(x => x.Id).NotEmpty();
        RuleFor(x => x.City).NotEmpty();
        RuleFor(x => x.Street).NotEmpty();
    }
}

/// <summary>
/// Validates only the id of an address
/// </summary>
public class PersonAddressValidator : AbstractValidator<Address>
{
    public PersonAddressValidator()
    {
        RuleFor(x => x.Id).NotEmpty();
    }
}

/// <summary>
/// Validates a Person
/// </summary>
public class PersonValidator : AbstractValidator<Person>
{
    public PersonValidator()
    {
        RuleFor(x => x.Name).NotEmpty();
        RuleFor(x => x.Address).SetValidator(new PersonAddressValidator());
    }
}

И ваши классы модели представления становятся просто:

[Validator(typeof(PersonValidator))]
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
}

[Validator(typeof(AddressValidator))]
public class Address
{
    public int Id { get; set; }
    public string City { get; set; }
    public string Street { get; set; }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...