Ответ 1
Вы можете наследовать свою модель от IValidatableObject, а затем добавить свою логику в метод Validate. Вам также придется удалить RequredAttribute из свойства. Вам нужно будет написать некоторый пользовательский javascript для проверки этого правила на клиенте, поскольку метод Validate не переводится в ненавязчивую систему проверки. Примечание. Я изменил свойства на строки, чтобы избежать кастинга.
Кроме того, если у вас есть другие ошибки проверки атрибутов, они сначала срабатывают и предотвращают запуск метода Validate, поэтому вы обнаруживаете эти ошибки только в том случае, если проверка на основе атрибутов в порядке.
public class Party : IValidatableObject
{
[DisplayName("Your surname")]
public string surname { get; set; }
[DisplayName("Type")]
public string party_type { get; set; }
...
public IEnumerable<ValidationResult> Validate( ValidationContext context )
{
if (party_type == "P" && string.IsNullOrWhitespace(surname))
{
yield return new ValidationResult("Surname is required unless the party is for an organization" );
}
}
}
На клиенте вы можете сделать что-то вроде:
<script type="text/javascript">
$(function() {
var validator = $('form').validate();
validator.rules('add', {
'surname': {
required: {
depends: function(element) {
return $('[name=party_type]').val() == 'P';
}
},
messages: {
required: 'Surname is required unless the party is for an organization.'
}
}
});
});
</script>