2016-09-30 46 views
1

由於我首先使用數據庫,我通過ViewModel驗證了我的輸入。但是這對於驗證來說足夠好,還是有一些不成文的規則來添加它在控制器?MVC - 足以在ViewModel中驗證嗎?

此外,什麼是最常見的屬性驗證,可以說密碼?

[Required] 
[StringLength(50)] 
[MinLength(3)] 
public string Password { get; set; } 

這是一個很好的驗證?

+0

我很樂意去糾正,但我相信*這些屬性會動態地設置HTML,以便輸入將具有「required」屬性集。但我不記得它曾經爲你做過服務器端檢查。您可能還需要清理控制器中的數據,這絕不是一個壞習慣。 –

+0

@DrewKennedy啊我明白了。你知道任何關於在控制器中添加驗證的好指南嗎? – Nyprez

+0

並不是一個指南,但是您始終可以使用'ModelState'運行驗證檢查,並使用'AddModelError'來定義每個問題,或者使用該屬性來定義錯誤消息。 [這是一個很好的例子](http://stackoverflow.com/a/21911236/4204026)。 –

回答

2

屬性驗證對於它可以完成的工作非常有用。除了您提到的驗證屬性之外,您還擁有EmailAddress屬性,可將給定屬性驗證爲電子郵件地址。

[EmailAddress(ErrorMessage = "Invalid Email Address")] 

然後,你必須做更復雜的自定義驗證的正則表達式驗證屬性:

[RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$", 
     ErrorMessage = "Characters are not allowed.")] 

對於條件驗證之類的事,你可以在邏輯添加到您的控制器和ModelState中添加錯誤,需要。

例子:

if (MyProperty == "something" && MyOtherProperty != "something") 
{ 
    ModelState.AddModelError("", "MyOtherProperty needs to be something") 
} 

如果你不想在你的控制器邏輯,樣板驗證代碼,您可以編寫自己的自定義驗證屬性。通過這樣做,你幾乎可以驗證任何你能想到的。

在互聯網上有關於該主題的大量資源。

How to create a custom validation attribute?

How to create Custom Data Annotation Validators

僅舉幾例。

0

不要忘記通過調用ModelState.IsValid來檢查ModelState的有效性。除此之外,我可以想象你需要做一些額外的數據庫驗證檢查。

+0

通過額外的數據庫驗證檢查,你是什麼意思,例如? – Nyprez

+0

假設有人註冊了一個帳戶。由他輸入的值可能是有效的,但如果輸入的用戶名尚未被採用,您仍然希望檢入數據庫。 – user1796440

+0

啊,我明白了!我想要做那個槽控制器嗎?可以說一個'用戶名'。如果數據庫中已經存在「用戶名」(仍然是槽控制器),我將返回「已存在」 - 錯誤。如果不是,則會添加「用戶名」。這是一個正確的方法嗎? – Nyprez