2010-09-18 41 views
0

我正在使用MVC 2.我有關於客戶端和服務器端驗證的問題。可以說,我有一個類,它有3個屬性爲這樣:使用數據註釋瞭解客戶端和服務器端驗證

[Required(ErrorMessage = "Required")] 
public object Property1 { get; set; } 

[Required(ErrorMessage = "Required")] 
public object Property2 { get; set; } 

[Required(ErrorMessage = "Required")] 
public object Property3 { get; set; } 

在我看來,我只有Property1和財產2,使他們文本框。我沒有將Property3添加到視圖中(但它被標記爲如上所需)。如果我沒有在文本框中輸入任何內容,那麼客戶端驗證將失敗。如果我在文本框中插入文本,即使Property3沒有設置值,客戶端是否會傳遞?它會在服務器端失敗嗎?

我點擊提交按鈕後,服務器端出現問題。這裏是我的代碼爲我創建行動:

public ActionResult CreateApplication(Application application) 
{ 
    try 
    { 
     application.ApplicationStateID = 1; 
     application.SubmitterEmployeeNumber = "123456"; 

     if (ModelState.IsValid) 
     { 
     // Code here 
     } 
    } 
    catch 
    { 
    } 
} 

ApplicationStateID和SubmitterEmployeeNumber沒有在客戶端設置(它們都標記爲必需的),所以我將它設置在這裏。在我設置它們之後,爲什麼驗證在服務器端仍會失敗?

回答

1

客戶端驗證將通過,因爲沒有相應的輸入元素進行驗證,服務器端驗證將失敗,因爲您強制要求輸入字段並且該字段值不會發布到服務器。您可以閱讀this blog post以瞭解模型驗證如何工作以及輸入驗證與模型驗證之間的區別。

+0

謝謝。看到我更新的問題,也許你可以更多地瞭解一些情況。我現在就去閱讀那篇文章。 – 2010-09-18 10:29:38

+0

原因是因爲驗證是在模型綁定期間執行的。在此模型綁定發生後,您正在設置所需的屬性**。一種可能的解決方法是使用'TryUpdateModel'方法而不是將其作爲動作參數傳遞。 – 2010-09-18 10:35:22

+0

謝謝你Darin。只是最後一個問題,我是否正確地做了這件事,把所有事情都放在一個嘗試和抓住?通常在Web表單中,我將檢查應用程序是否爲空,如if(application == null)。 – 2010-09-18 10:38:05

相關問題