【问题标题】:how to call class validation attribute first instead of property validation attribute C#如何首先调用类验证属性而不是属性验证属性C#
【发布时间】:2020-03-09 09:08:24
【问题描述】:

我在 web api 中有一个模型,它有 5 个属性。

[CheckAtleastNProperties2(ErrorMessage = "Please provide atleast one property")]
public class Class1
{

    [RequiredIfCustom("Provide either prop1 and prop2 or prop3, prop4 and prop5.", "prop2")]
    public string prop1 { get; set; }
    [RequiredIfCustom("Provide either prop1 and prop2 or prop3, prop4 and prop5.", "prop1")]
    public int prop2 { get; set; }
    [RequiredIfCustom("Provide either prop1 and prop2 or prop3, prop4 and prop5.", "prop4", "prop5")]
    public string prop3 { get; set; }
    [RequiredIfCustom("Provide either prop1 and prop2 or prop3, prop4 and prop5.", "prop3", "prop5")]
    public string prop4 { get; set; }
    [RequiredIfCustom("Provide either prop1 and prop2 or prop3, prop4 and prop5.", "prop3", "prop4")]
    public string prop5 { get; set; }
}

我为类创建了两个自定义属性CheckAtleastNProperties2,为属性创建了RequiredIfCustom,现在我想要检查用户是否提供了至少一个属性,然后检查属性验证RequiredIfCustom(),而不是检查@987654326 @ first,它总是首先检查RequiredIfCustom,是否可以检查或强制首先调用类级别验证属性而不是属性级别验证属性?

这里是 CheckAtleastNProperties2 的实现,它检查用户是否为至少一个属性提供了值:

[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class CheckAtleastNProperties2 : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var properties = validationContext.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance);
        if (properties.Where(x => x.GetValue(value, null) != null && x.PropertyType.IsValueType && !x.GetValue(value).Equals(Activator.CreateInstance(x.PropertyType))).Count() != 0)
        {
            return ValidationResult.Success;
        }
        else
        {
            //ErrorMessage = "Provide either Accountnumber and InstitutionID or Fname, Lname and Last4DigitSSN.";
            return new ValidationResult.Success;
        }

    }
}

这里是RequiredIfCustomAttribute的实现,它检查用户是否为prop1提供了值,然后它应该为prop2提供值等等:

[AttributeUsage(AttributeTargets.Property)]
public class RequiredIfCustomAttribute : ValidationAttribute
{
    private string[] _properties { get; set; }
    private string _errorMessage { get; set; }
    public RequiredIfCustomAttribute(string errorMessage = null, params string[] properties)
    {
        _properties = properties;
        _errorMessage = errorMessage;
    }

    protected override ValidationResult IsValid(object value, ValidationContext context)
    {
        //logic for conditional check 
        return ValidationResult.Success;
    }
}

我的问题是,它总是在 CheckAtleastNProperties2 之前先调用RequiredIfCustom,我希望现在清楚了。

【问题讨论】:

  • 我不明白你的问题。 “检查属性验证RequiredIfCustom()”是什么意思?您能否详细说明您的验证应该做什么?
  • 没用过core,但是MVC方式曾经是IValidatable接口:weblogs.asp.net/scottgu/…
  • @HimBromBeere,这些是验证属性。
  • 自定义验证属性的具体实现是什么?根据仅提供的自定义属性名称,我们无法为您的问题提供有效的建议或解决方法。
  • @XueliChen 更新问题。

标签: c# asp.net-mvc asp.net-core asp.net-core-webapi


【解决方案1】:

您需要实现 IValidatableObject。将验证检查放在 Validate 方法中。最后返回错误列表。

public class Class1 : IValidatableObject
{
    public string prop1 { get; set; }
    public int? prop2 { get; set; }
    public string prop3 { get; set; }
    public string prop24 { get; set; }
    public string prop5 { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        List<ValidationResult> errors = new List<ValidationResult>();
        if (string.IsNullOrWhitespace(prop1) && prop2.IsNull && string.IsNullOrWhitespace(prop3) && string.IsNullOrWhitespace(prop4) && string.IsNullOrWhitespace(prop5) &&)
        {
             errors.Add(new ValidationResult($"Please provide at least one property.", new List<string> { }));
        }
        return errors;
    }
}

请参阅 Microsoft 文档 https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-3.0#ivalidatableobject

查看原始答案ASP.NET Core Conditional Validation for controls

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 2011-01-31
    • 2013-01-17
    • 1970-01-01
    • 2014-03-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多