2016-09-20 82 views
0

給定一個包含屬性的類並編寫自定義驗證器(如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 
} 
+0

檢查FluentValidation,也許這可以幫助你不必處理自定義屬性。 – PmanAce

回答

1

簡短的回答:沒有

龍答:你可以得到這個行爲與一些自定義代碼和反射,但在這種情況下,你已經勾畫出不需要的。

[Required]屬性允許您指定空/空字符串是否有效。它也只驗證字符串。驗證您需要的整數Range

參見:RequiredAttribute on MSDNRangeAttribute on MSDN

從你的榜樣,[FooExists]正如我所說的,是沒有作用的,因爲你是用一個整數值工作。如果不需要字段,則根本不需要屬性。

+0

範圍不會告訴您值是否已刪除或不再有效。 –

+0

是的,這應該是一個字符串。編輯。 – Jared

+0

接受這個,但附加:我的解決方案是讓我的自定義驗證器返回true,如果該屬性的值爲null。如果你不想讓null通過,那麼這就是爲什麼他們有[Required]標籤,除了[CustomValidator] – Jared