2008-11-30 76 views
2

我正在爲一個類項目製作一個C#應用程序。我想確保一個字符串有三個值之一。通常,在Web應用程序中,我會在客戶端使用JavaScript進行驗證。但是,這是目前的控制檯應用程序。我知道我應該儘早進行驗證,但驗證有什麼好的經驗規則?應用程序的最佳位置在哪裏進行驗證?經驗法則?

回答

8

每個模塊都應該進行自己的驗證,並且永遠不要相信調用代碼給出的內容。這通常意味着驗證應該發生在應用程序的每一層。您尤其不希望在客戶端發生任何驗證,因爲這可能會導致安全漏洞。已知客戶端上運行的代碼會不時發生變化。

0

根據應用程序的進展情況,您可以在離開該頁面/步驟之前進行驗證(如果它像一個嚮導,可以逐步瀏覽多個頁面/步驟),也可以在用戶離開該文本框後立即生效/值。另一個選項是修改時的驗證。

2

作爲一個經驗法則,如你所說,你應該儘可能早地驗證,但在客戶端 - 服務器應用程序,它儘快驗證服務器上的數據,以防止可能出現的安全問題是非常重要的。

+0

正確...客戶端的冗餘驗證可以避免驗證往返,但服務器必須負責所有驗證,以防止來自其他源的未驗證命中。 – 2008-11-30 15:39:49

1

我喜歡在用戶點擊Ok或Next之後驗證 - 在他們離開他們所在的屏幕之前。在修改過程中驗證很少有效 - 用戶必須能夠退格,在輸入字符串時插入字符串,並且複製/粘貼到字符串字段有它自己的問題。如果字符串顯示爲紅色,直到它是有效的,這可能會有所幫助,但是您仍然必須防止繼續進行,直到它得到糾正。同樣,對於離開文本框,在進行數據輸入時顯示消息框可能會很刺激。等到用戶說完成完成,並立即進行所有驗證。

2

我認爲你應該驗證三次。

  1. 在客戶端,2在服務器和3在數據庫中的檢查約束。

在控制檯應用程序中,您可以立即驗證,因爲您知道用戶將按什麼順序輸入數據。

3

如果你正在做MVC,機會是你從地上爬起來使用TDD工作。

我不知道這是否是最好的方式,但我做事的方式是..

  • 讓我的業務對象。
  • 定義某種驗證框架,因此業務對象可以返回當前狀態的錯誤列表並使用單元測試來測試這些錯誤。
  • 如果您使用LINQ to SQL中,實現分部方法的OnValidate(),並使它所以它要求你的mybusinessobject.geterrors()。 OnValidate在您執行db時會被調用。提交更改()以便您可以停止保存無效數據
  • 現在,在您的控制器中,當有人創建新的業務對象或編輯一個對象時,請使用從用戶獲得的任何數據創建對象 - 然後調用您的geterrors()方法,做任何
  • 然後客戶端驗證,如果你可以arsed

這是這裏所描述斯科特·格思裏的框架:http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

我喜歡它,它意味着你可以一次定義業務規則並在不同的層次上重複使用它們,這意味着它不太可能會錯過它們當你更新東西時的一個特定區域

0

關於一般最佳實踐有很多很好的答案......但是你的問題指定了「MVC」,並且只有一個正確的答案。

編輯:你的「問題」沒有說MVC,但你的標籤沒有。

MVC =模型視圖控制器

所有的業務邏輯是在控制器中。這是答案。

在這篇文章中的其他答案是偉大的提示,如「不信任客戶端驗證」......和「無處不在驗證」。

0

另一個提示:如果您可以在元信息中定義您的驗證規則,那麼所有驗證邏輯都可以解釋的情況下,驗證無處不在。然後,您只需要在一個地方定義規則,而不必擔心客戶端驗證,服務器端驗證和測試用例彼此不同步。

1

我喜歡Timothy's picking up on MVC

由於我們對應用程序的性質瞭解很少,所以我想指出一些非常一般的經驗法則以及已經提供的良好建議。

驗證的方式,

  1. 不可逆的動作與無效輸入

  2. 執行的用戶不會失去工作

  3. 用戶的活動從來沒有把的狀態下錯誤的輸入不容易識別並且簡單地收回

  4. 應用程序w生病在一個糟糕的狀態不是失敗或崩潰

  5. 無(共同)持續的材料離開過(或見到)作爲無效數據

  6. 一個用戶的應用程序的處理結果是不是沮喪在完成其有用作爲驗證完成的方式和時間的結果

這應該是很好的掩蓋它。

相關問題