2008-09-02 116 views
3

在我的previous question大多數評論者都認爲,在客戶端&服務器端驗證邏輯是件好事。確保服務器端和客戶端之間的驗證邏輯同步

但是有一個問題 - 您需要保持數據庫和客戶端代碼之間的驗證規則同步。

所以問題是我們該如何處理呢?

一種方法是使用ORM技術,現代的ORM工具可以生成代碼,在將數據發送到服務器之前可以處理數據驗證。

我有興趣聽取您的意見。
您是否有某種標準流程來處理這個問題?或者,也許你認爲這根本不是問題? :)

編輯

夥計們,首先感謝您的答案。

明天我會總結一下你的答案和更新問題的文字像this case

回答

3

正如在回答其他職位的人提到,如果你要保持你的分層,有沒有好辦法避免重複每個圖層中的驗證邏輯。如果你使用某些東西來自動將它們綁定在一起,你已經在層之間引入了一種可能阻礙你行進的耦合。這可能是您需要手動跟蹤事件的情況之一。

但是你要做的是,你必須確保每個圖層都在進行自己的驗證,因爲你永遠不知道該圖層將如何被訪問。無法保證您實施的所有圖層始終保持在一起。

1

我喜歡使用驗證服務,它不一定關心要驗證的數據的來源。當您瞭解將驗證規則傳輸到客戶端(即網頁)的部分時,這可以以幾種不同的方式工作,但我認爲最重要的方面是對實際驗證規則擁有單一權限。例如,如果您在數據核心實體上具有驗證邏輯,例如通過Validate方法(一種非常典型的場景)檢查的ValidationRule對象集合,那麼我會將這些相同的規則提升到客戶端(javascript)通過轉型。

在ASP.NET世界(我可以說的唯一一個)中,有幾種方法可以做到這一點。我的首選方法涉及創建自定義驗證器,將您的UI小部件綁定到實體上的字段(及其所有驗證規則)。這樣做的好處是所有的驗證邏輯都可以綁定到一個驗證器中。不利的一面是您的驗證信息將變得密集,因爲驗證規則都是一次全部測試的。當然,這可以通過讓你的驗證邏輯只返回第一個失敗的提及來緩解,等等。

這個答案可能聽起來有點含糊不清,但我想要做的兩點是:

  1. 驗證應儘可能接近輸入數據和提交數據的位置。無論發生驗證
  2. 相同的驗證規則,應使用 - 如果客戶端驗證通過,那麼它應該永遠以後驗證失敗(預存業務規則,外鍵衝突等)
1

一些框架提供驗證支持,可以保持您的客戶端和服務器驗證同步。看看這個Seam validation tutorial使用註釋。這是一個很好的實現,很容易理解。

無論如何,如果你不想依賴框架,我認爲很容易實現類似的東西。

0

如果您使用ASP.Net,您可以使用多種驗證控件。這些控件是以一種非常通用的方式編寫的,因此它們中的大多數會自動在客戶端和服務器之間複製驗證邏輯,即使您只在一個位置爲控件設置了選項。

您也可以從中繼承來創建其他特定於域的驗證器,並且網上還有第三方控件包,您可以將它們添加到基本控件中。

即使你不使用ASP.Net,也值得看看這是如何完成的。它會給你如何在自己的平臺上做類似的想法。