ASP.NET MVC. Как отключить обязательную проверку на основе параметра?

У меня есть класс сущностей с некоторыми обязательными атрибутами в зависимости от селектора.

Например: Селектор может принять "1" или "2". Если селектор был "1", потребуется группа параметров. Если селектор равен "2", требуется другой набор параметров.

class MyClass{

    public int Selector {get;set;} // 1 or 2

    public string A_required_for_1 {get;set;}
    public string B_required_for_1 {get;set;}

    public string C_required_for_2 {get;set;}
    public string D_required_for_2 {get;set;}

    public string E_Required_for_both_selectors {get;set;}

}

Пользователь должен иметь возможность переключаться между селекторами во время действий Create или Edit в представлении.

Проверка клиента уже решена.

Как я могу справиться с этим при проверке сервера?


person Daniel Santos    schedule 29.07.2016    source источник
comment
это не Отключить обязательный атрибут проверки при определенных обстоятельствах дублировать   -  person Daniel Santos    schedule 29.07.2016
comment
Сделайте себе одолжение и разделите функции EDIT и CREATE в своем приложении.   -  person    schedule 29.07.2016
comment
@NicholasKinney Я не понимаю, почему ваш комментарий относится к вопросу. не могли бы вы уточнить это?   -  person Daniel Santos    schedule 29.07.2016
comment
Если вы строго печатаете свое представление со строго типизированным объектом, вам нужно разделить свои объекты между представлениями EDIT и CREATE. Надеюсь, это поможет.   -  person    schedule 29.07.2016
comment
Надеемся, что эта ссылка поможет решить вашу проблему.   -  person etrupja    schedule 29.07.2016


Ответы (2)


Вы можете либо создать свой собственный атрибут проверки, либо использовать проверку MVC Foolproof, а затем выполнить:

class MyClass
{

    public int Selector {get;set;} // 1 or 2

    [RequiredIf("Selector == 1", ErrorMessage = "Your Error Message")]
    public string A_required_for_1 {get;set;}

    [RequiredIf("Selector == 1", ErrorMessage = "Your Error Message")]
    public string B_required_for_1 {get;set;}

    [RequiredIf("Selector == 2", ErrorMessage = "Your Error Message")]
    public string C_required_for_2 {get;set;}

    [RequiredIf("Selector == 2", ErrorMessage = "Your Error Message")]
    public string D_required_for_2 {get;set;}

    [Required("Your Error Message")]
    public string E_Required_for_both_selectors {get;set;}

 }

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

Для пользовательского атрибута проверки вы можете сделать что-то вроде этого:

public class RequiredIfOtherProperty : ValidationAttribute
{
    private readonly string _otherPropertyName;
    private readonly string _compareValue;

    public RequiredIfOtherProperty(string otherPropertyName, string compareValue)
    {
        _otherPropertyName = otherPropertyName;
        _compareValue = compareValue;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var otherProperty = validationContext.ObjectType.GetProperty(_otherPropertyName);
        if (otherProperty == null)
        {
            return new ValidationResult($"Property '{_otherPropertyName}' does not exist");
        );

        var otherPropertyValue = otherProperty.GetValue(validationContext.ObjectInstance, null);
        if (!_compareValue.Equals(otherPropertyValue))
        {
            return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
        }

        return null;
    }
}

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

[RequiredIfOtherProperty("SomeProperty", "ValueToCompareWith")]
person Kevin Lee    schedule 29.07.2016
comment
Хорошая библиотека, но это бета-версия 0.9.4517, которая не обновлялась с 14 мая 2012 г. - person Win; 29.07.2016
comment
Что вы подразумеваете под пользовательским атрибутом проверки? - person Daniel Santos; 29.07.2016

Я считаю, что mvcfoolproof подойдет для этой ситуации [https://foolproof.codeplex.com/][1] Он также доступен в nuget. Он добавляет дополнительные атрибуты проверки, такие как

[RequiredIf]
[RequiredIfNot]
[RequiredIfTrue]
[RequiredIfFalse]
[RequiredIfEmpty]
[RequiredIfNotEmpty]
[RequiredIfRegExMatch]
[RequiredIfNotRegExMatch]

Он очень прост в использовании.

person Scott Hinshaw    schedule 29.07.2016
comment
Хорошая библиотека, но это бета-версия 0.9.4517, которая не обновлялась с 14 мая 2012 г. - person Win; 29.07.2016