2011-11-11 65 views
3

我實際上開始學習mvc體系結構。在MVC軟件體系結構中放置驗證邏輯的地方

我很困惑是否將我的用戶名註冊驗證邏輯放在模型或控制器中。

我有一些狀態消息,告訴用戶是否有新的註冊用戶名可用。

我的困惑開始了,因爲大多數消息來源都說它應該在模型中,因爲它涉及在將數據放到數據庫之前驗證的用戶名數據(而不是檢查用戶名字段的輸入)。但是,狀態消息應該在更改用戶名字段之前立即響應用戶按鍵或更改,這導致我認爲它應該在控制器中,因爲它涉及更多用戶事件。

我關心的不是實際使用的框架,而是涉及MVC的標準概念。我在哪裏根據上面的條件/前提放置了用戶名驗證邏輯?

回答

3

正如Shikhar所說,實際檢查名稱是否可接受/可用是模型責任。控制器可以提供一個由頁面上的某個AJAX調用的動作,這樣當每個鍵被按下時,頁面上的文本被髮送到專用控制器動作,然後通過模型驗證它(觸摸數據庫的任何東西都是模型)。

在視圖中有幾件事情需要考慮,比如當用戶快速打字時,您應該在製作新的電話之前取消先前的電話,因爲這會引起混淆。

此外,當用戶在數據輸入結束時提交表單時發生的控制器後期操作應執行與AJAX操作相同的驗證,以避免用戶之間的競爭條件。

3

它應該在模型中,因爲您已經閱讀過自己。我認爲你在「驗證過程」和「驗證規則」之間混淆不清。驗證過程將在客戶端的控制器中,但驗證規則是模型的屬性。

+0

在我的問題的背景下。哪部分是驗證過程,哪部分是驗證規則? –

+1

如果您檢查用戶名是否有效 - 它的驗證過程,請按鍵。如果你正在檢查用戶名是字母數字,那麼它就是一個驗證規則,你可能已經得到了像這個用戶 - > validationRule(用戶)或user-> isValid() – shikhar

+0

驗證與數據庫無關。 – shikhar

0

作爲@Colin Desmond的補充,模型實例不應該包含'錯誤'數據,因此,在我看來,在MVC環境中應該包含驗證邏輯。因此,無論創建模型實例的位置如何,都不能使用錯誤數據進行初始化,並且對模型實例進行操作的類可以依賴其數據。例外情況是,如果存在與視圖相關的驗證邏輯。視圖相關的邏輯(例外)應該在控制器中實現。

例如,驗證電子郵件地址應該在模型中實現。但是,某個模型可能允許銀行交易金額爲負,但查看A可能不允許交易金額爲負數。該異常的邏輯應該在控制器上執行。