【发布时间】: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