5

我正在尋找一種方法來實現Fluent驗證的不顯眼的定製驗證。根據documentation,它似乎沒有表明它支持不顯眼的驗證。Fluent驗證的不顯眼的定製/條件驗證

同樣適用於使用條件驗證(When/Unless)。我在他們的MVC documentation,不顯眼的驗證看是不是用條件和其他複雜的驗證支持:

注意FluentValidation還將與ASP.NET MVC的客戶端驗證工作,但不是所有的規則都支持。例如,使用條件(使用時/除非),自定義驗證器或Must調用定義的任何規則不會在客戶端運行。下面驗證器所支持的客戶端上:

* NOTNULL/NotEmpty
*匹配(正則表達式)
* InclusiveBetween(範圍)
*信用卡式
*電子郵件
* EqualTo(交屬性相等比較)
*長度

因此有任何人想出如何得到這個工作?如果不是,是否還有其他驗證選項可以爲不顯眼的定製/複雜驗證提供更好的支持?

+0

你能提供一個你試圖實現/驗證的具體例子嗎?你確切的情況是什麼? –

+0

那麼,無論如何,只要使用When/Without方法不會不引人注目地工作。即使我能找到適用於這些解決方案的解決方案,也會讓我更靠近一步。可能的話,如果它工作w /條件如時/除非,它可能會工作與自定義驗證以及。 –

回答

1

我插上FluentValidation到ASP.NET MVC 3成功,通過遵循Integration with ASP.NET MVC文檔。

簡單的方法是堵塞FluentValidation到在Global.asax中的Application_Start()這樣的MVC驗證框架:

FluentValidationModelValidatorProvider.Configure(); 

然後你就可以用屬性修飾你的POCO類,指定他們所使用的驗證。

[Validator(typeof(PersonValidator))] 
public class Person { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public int Age { get; set; } 
} 

就我而言,我並不想這樣做(使用屬性),以及實際需要,驗證同樣的POCO類針對不同的驗證程序,根據業務規則。

如果要選擇不同的驗證這種方式,遵循「custom validator factory with an IoC container」的文檔。創建一個FluentMvcValidatorFactory子類,它實現了接口IValidatorFactory的ValidatorFactoryBase。自定義驗證器工廠可以處理選擇適當的驗證器。

我試圖讓客戶端驗證工作(它),但它似乎也插入不顯眼的驗證。我的HTML輸出看起來像這樣:

<input type="text" value="" name="Email" id="Email" data-val-length-max="128" data-val-length="&amp;#39;Email&amp;#39; must be between 0 and 128 characters." data-val-email="&amp;#39;Email&amp;#39; is not a valid email address." data-val="true" class="text-box single-line"> 

只要你把它插入到MVC正確,我想不顯眼的應該工作。

實際上,您不應該完全依賴客戶端或不顯眼的驗證,只能在輸入過程中用它來幫助用戶。最終服務器需要驗證,但是你可以讓你的服務器端代碼使用相同的FluentValidation驗證器。

+1

感謝您的信息。我實際上有標準驗證工作不顯眼,問題是獲取時/除非條件驗證工作,或自定義驗證(我創建我自己的驗證規則)。 –

+0

我看到了 - 所以你想使用FluentValidation來定義自定義驗證規則(條件),並將這些規則轉換爲客戶端驗證的自定義jquery.unobtrusive.validation規則?這是不支持的。因此,需要一個自定義代碼來彌補差距。在客戶端使用自定義規則有多重要,而不是使用服務器帖子?也許這是過度殺傷。使用FluentValidation的部分原因是您編寫的代碼更少 - 客戶端和服務器上的驗證規則相同。 –

+1

我同意。但是在很多情況下,只有在某些情況下才需要驗證某些字段(即,如果未選中「與結算相同」複選框,則需要送貨地址字段)。對我來說,這似乎是一個常見的要求,正如你所說的,我不想爲此編寫單獨的驗證,因爲不顯眼的驗證不適用於這些When/Without條件。 –