2013-08-02 44 views
2

我試圖在Orchard的管理頁面中使用客戶端驗證。我已經成功地使其工作使用this question討論的技術,但這樣做在烏節源和網上一些挖掘之後,在我看來,註釋掉這些行果園客戶端驗證 - 它應該如何顯示/工作?

// Register localized data annotations  
ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(new LocalizedModelValidatorProvider()); 

正在顛覆一些內置的允許本地化錯誤字符串的果園功能。在這一點上,要麼在我們的OrchardStarter.cs之外擁有這些行是驗證工作和不爲我工作的唯一區別。

我期待的是一些指導,也許來自Orchard團隊。如果這些行必須出來才能使驗證生效,爲什麼他們首先出現?如果他們出於一個很好的理由,我(和其他人)在我們試圖獲得客戶端驗證工作的過程中做了什麼錯誤?如果需要,我很高興發佈代碼示例,儘管它是一個帶有數據註釋的非常標準的ViewModel。謝謝。

回答

2

這些行可以用Orchard自己的實現替換DataAnnotationsModelValidatorProviderDAMVP),它允許將驗證消息本地化爲Orchard方式。它的做法是通過替換例如[Required][LocalizedRequired],然後將控制權交給DAMVP。請注意0​​確實可以完成它的工作 - 但只有在果園已經與屬性「搞砸」之後。

問題是DAMVP使用Attribute的類型來應用客戶端驗證屬性。現在它不會找到例如RequiredAttribute,因爲它已被替換爲LocalizedRequiredAttribute。因此它不會知道它應該添加的客戶端驗證屬性(如果有的話)。

因此,對線條進行評論會讓你失去烏節的本地化。留下它們會使你失去客戶端驗證。

一個解決辦法是威力工作(還沒有看夠通過果園的代碼,並沒有在目前測試手段)將是使DAMVP瞭解果園的Localized屬性,並與他們做什麼。

DAMVP有一個靜態的RegisterAdapter()方法用於爲屬性添加新的客戶端規則。它採用屬性的類型和客戶端適配器(負責添加客戶端屬性的類)使用的類型。

所以,像下面這樣可能工作:

在OrchardStarter.cs:

// Leave the LocalizedModelValidatorProvider lines uncommented/intact 

// These are the four attributes Orchard replaces. Register the standard 
// client adapters for them: 

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(LocalizedRegularExpressionAttribute), 
    typeof(RegularExpressionAttributeAdapter) 
); 

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(LocalizedRequiredAttribute), 
    typeof(RequiredAttributeAdapter) 
); 

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(LocalizedRangeAttribute), 
    typeof(RangeAttributeAdapter) 
); 

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(LocalizedStringLengthAttribute), 
    typeof(StringLengthAttributeAdapter) 
); 

至於官方的字,似乎因爲本地化的驗證是在1.3中引入這個沒有工作,並且影響被認爲是低的:http://orchard.codeplex.com/workitem/18269

因此,目前看來問題標題的官方答案是「它不應該」。

+0

謝謝,你已經採取了我已經知道/假定的情況,並將它與我沒有的東西一起編織在一起,並給我我需要的答案。非常感激。 – Zannjaminderson