MVC Условное Vallidation Обязательно, если - PullRequest
0 голосов
/ 25 марта 2012

Я использую пользовательскую проверку, она отлично работает для одного значения, однако мне нужно проверить наличие нескольких значений, например:

[Обязательно, если («Страна», «Канада», «Требуется почтовый индекс»)]
[RequiredIf («Страна», «США», «Требуется почтовый индекс»)]
открытая строка PostalCode {get; задавать; }

Я получаю дубликат атрибута RequiredIf! Заранее спасибо.

1 Ответ

3 голосов
/ 25 марта 2012

Вы не можете применить одну и ту же аннотацию данных дважды к одному свойству.

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

public class PostalCodeRequiredAttribute : ValidationAttribute
{
    private const string errorMessage = "{0} is required.";
    public string CountryPropertyName { get; private set; }

    public PostalCodeRequiredAttribute(string countryPropertyName) : base(errorMessage)
    {
        CountryPropertyName = countryPropertyName;
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(errorMessage, name);
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null) return ValidationResult.Success;

        var countryPropertyInfo = validationContext.ObjectType.GetProperty(CountryPropertyName);
        string country = countryPropertyInfo.GetValue(validationContext.ObjectInstance, null).ToString();
        // assuming your country property is bound to a string

        string name;

        if (country == "United States")
             name = "Zip code";
        else if (country == "Canada")
             name = "Postal code";
        else
             return ValidationResult.Success;
             // assuming postal code not required for all other countries

        return new ValidationResult(FormatErrorMessage(name));
    }
}

Вы можете аннотировать таким образом, предполагая, что свойство вашей страны называется Country:

[PostalCodeRequired("Country")]
public string PostalCode { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...