Я не знаю, что вы подразумеваете под Мне нужно проверить каждое свойство в адресе, но при проверке лица мне нужно проверять только идентификатор адреса .Поправьте меня, если я ошибаюсь, но вот как я понимаю ваш вопрос: у вас есть два разных действия контроллера:
[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; }
}
И ваши действия контроллера остаются нетронутыми, за исключением того, что они теперь ведут себя какожидается.