2010-10-18 44 views
3

我覺得我在開發ASP.NET Webform應用程序時與當前的戰鬥。我經常遇到同樣的問題,而當我最終找到某種解決方法時,我從未完全滿意過結果。如何管理複雜的數據輸入驗證

下面是一個典型的問題的一個例子:

設計需要網格或網格狀的結果集。此結果集是從數據庫中提取的,但是,每個行上都有其他控件沒有數據綁定,但其內容用於將數據插入其他記錄。

一個很好的例子就是顯示一個產品列表,然後根據在數量字段中輸入的值以及每個產品選擇的選項將所選產品添加到購物車。投入混合,你必須允許多條線同時添加到購物車,並且開始變得更加複雜。

讓我們來補充一下,你不能一起選擇某些產品(互斥),你只能選擇一定數量的一種產品,而不能選擇另一種產品,價格可能會在用戶選擇物品時發生變化,你可以根據購買的數量(每件產品和整個訂單)獲得每件商品的總體折扣,你使用的是信用額度,不能超過信用額度,也不能購買比給定商品多的商品任意金額設置在您的賬戶或產品中由您的賬戶代表(認爲某些非政府機構限制您可以購買的藥物數量)等等..等等..

什麼開始作爲添加到購物車的簡單網格變成商業邏輯的絕望混亂,whi然後當然需要驗證並向用戶通知其選擇中的各種錯誤。

如何處理asp.net中非常複雜的數據錄入方案?你甚至開始設計一款軟件來完成這一切?

編輯:

請不要建議改變接口,該接口是沒有問題的。用戶對它很好,他們要求它按照它的方式工作。我正在尋求如何設計和解決實施問題的幫助。

回答

1

不要在你的代碼中放置除基本驗證以外的任何東西。後面的代碼應該只取用戶輸入的內容,構建一個業務對象(或業務對象集合)並讓這些業務對象驗證自己。

每個業務規則應該是業務對象上的一個函數調用,該業務對象只處理一條規則而沒有別的。然後,您只需一個接一個地打電話給他們,並跟蹤哪些通過,哪些通過失敗。

當驗證失敗時,業務對象可以在足夠的信息後面提供代碼,以便顯示正確的錯誤並突出顯示有錯誤的字段。

+0

我不確定你是否真的閱讀我的要求。驗證不能逐行進行,因爲有些行不包括其他行。如果我從頭到尾都有問題,那麼我有問題,我之前處理的訂單項有效,但在列表中稍後無效。 – 2010-10-20 20:04:17

+1

我沒有一行一行地說 - 我說規則的規則。一些規則可以在特定的行(或業務對象)上實現。其他規則只能在整個訂單(或業務對象集合)上實施。重要的是每個規則都是自包含的,這有助於代碼的可讀性。 – 2010-10-20 20:29:55

+0

有趣的觀點。我通常從操作的角度來考慮必須在數據上執行的事情,而不是規則和他們使用的數據。但是,這種情況下的規則既是全球性的,也是數據驅動的。但是這給了我一些想法。 – 2010-10-20 21:52:18

1

一些選項來考慮:

  • 分離出你的驗證邏輯,所以你可以從兩個客戶端和服務器端代碼(使下一個點)調用它。
  • 使用AJAX執行服務器端驗證,並在用戶執行各種任務(即增加數量)時提供即時反饋。
  • 在執行任何操作之前和之後,向用戶提供豐富而清晰的指示/反饋。之前:警告產品X不能用產品Y購買(特別是如果Y已經在購物車中)。之後:準確解釋問題並提出糾正的方法,例如「爲什麼不移除產品Y?」)
  • 優雅地失敗,即如果只有一個產品未通過驗證,則確保添加其他所有產品。
  • 簡化輸入過程,例如,一次只允許將一個產品添加到購物車。

最後一點很重要。一個複雜的數據錄入過程可能會在用戶開始之前混淆用戶,並試圖瞭解許多驗證錯誤。甚至在你開始對驗證邏輯進行編碼之前。

+0

如果我不清楚,我很抱歉。我並沒有問如何簡化這個過程,而是在問如何實現它。我無法改變這些要求,它們是固定的,並且堅定不移。用戶不會對界面感到困惑,因爲它對於行業來說是預期的和正常的。我以購物車爲例,所以您可能對這些概念更加熟悉。 – 2010-10-18 04:50:27

+0

@Mystere Man - 我認爲前兩點就足夠了。如果您的服務器上存在您的驗證邏輯,那麼您可以通過JS調用(通過AJAX)執行實際的驗證。所以,邏輯是在一個地方,並有兩個來電者。 – StingyJack 2010-10-20 18:20:29

+0

@SingyJack - 我沒有詢問客戶端驗證。不需要或不需要。我在問如何在asp.net中實現這種複雜性的驗證。 – 2010-10-20 18:28:15