給定一個包含屬性的類並編寫自定義驗證器(如FooExists
),我希望能夠在我的FooExists
功能中查看相鄰的驗證裝飾器。除非我有更聰明的東西,我應該這樣做。C#級屬性驗證器瞭解相鄰驗證器
我有自定義驗證器,我扔在各種類的屬性頂部。在某些情況下,我將它與[Required]
配對。
在不需要的情況下,我希望能夠檢查在我的覆蓋範圍內IsValid
,並以不同方式處理它。
public class ExampleDTO
{
[Required]
[FooExists]
public string Foo { get; set; }
public string Bar { get; set; }
}
public class AnotherExampleDTO
{
[FooExists]
public string Foo { get; set; }
public bool IsMoo { get; set; }
}
[AttributeUsage(AttributeTargets.Property)]
sealed public class FooExistsAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
// ideally I could check if this property is required via [Required]
// look things up in the database, return true or false
return true;
}
}
這種情況的原因是全部,如果我做一個POST到控制器接收ExampleDTO
,它會被驗證,使得美孚存在(必需),且這個值是合法的(FooExists)。但是,如果我向接收AnotherExampleDTO
的控制器發佈POST並省略Foo參數(因爲它不是必需的),我不希望它失敗FooExists
。 FooExists可以檢查它是否爲空,但我真的想說「如果不需要,並且null,那很好,返回true」。
我曾幻想過與周圍加入我自己的必填屬性,這樣我就可以[FooExists(Required=true)]
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
sealed public class FooExistsAttribute : ValidationAttribute
{
public bool Required { get; set; }
public override bool IsValid(object value)
{
if (!Required && value == null)
return true
// look things up in the database, return true or false
return true;
}
}
但這種感覺錯了,更何況我失去了自由[Required]
錯誤消息。
我也想避免(在這種情況下)在我的DTO繼承IValidatableObject並把這個模型:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
// I could check all of the class properties in here
}
檢查FluentValidation,也許這可以幫助你不必處理自定義屬性。 – PmanAce