2011-06-27 75 views
20

我在ASP.NET MVC 3項目中使用Data Annotations來驗證模型。這些非常方便,但目前它們對我來說很神奇。我讀過數據註釋做而不是拋出異常。 MVC如何知道向模型狀態字典添加驗證錯誤?如果沒有發生異常,那麼由於模型驗證冒泡到MVC而無法在模型上設置屬性?我總是認爲每次屬性失敗都會引發異常,並且MVC模型綁定捕獲異常並將其添加到模型狀態字典中。數據註釋如何工作?

爲了測試這一點,我創建一個控制檯應用程序和加入的樣品類與驗證註解它:

public class MyObject 
{ 
    [StringLength(10, MinimumLength=3)] 
    public string Name { get; set; } 
} 

我然後實例化的對象,並試圖將值分配給該人的名稱屬性小於3 。屬性分配得很好,儘管註釋說字符串長度小於3是不允許的。

static void Main(string[] args) 
    { 
     MyObject mine = new MyObject(); 
     mine.Name = "hi"; 
     Console.WriteLine(mine.Name); 
     Console.ReadLine(); 
    } 

這個小程序向控制檯寫出「hi」。爲什麼?當我試圖將mine.Name設置爲「hi」時,我期待它生氣。

我錯過了什麼?

在此先感謝。

回答

15

你從不叫什麼來驗證性能。驗證不會自行發生。從http://msdn.microsoft.com/en-us/library/dd901590%28v=vs.95%29.aspx

手動驗證值

當你不使用DataGrid 控制提供接口 編輯數據,驗證 屬性不會自動 應用。但是,您可以通過使用 Validator類來手動應用 應用驗證測試。您可以調用屬性集 的 ValidateProperty方法來檢查 值與屬性的驗證 屬性。您必須 也將ValidatesOnExceptionsNotifyOnValidationError屬性 設置爲true時,數據綁定接收 驗證異常從驗證 屬性。有關應用驗證的手動 示例,請參閱下面的數據 綁定示例。

+0

如果我做'mine.Name.'我看不到一個名爲'ValidateProperty'的方法。 – Chev

+5

它不在mine.name上。這可能應該是:「從屬性的set訪問器的*內*調用Validate.ValidateProperty方法...' –

+0

Ohhhh,gotcha。ty – Chev

3

C#提供了定義聲明標籤,叫做 屬性,你可以在某些實體將在源代碼 指定附加信息的機制。屬性中包含的信息可以在運行時通過反射來檢索。

https://msdn.microsoft.com/en-us/library/aa288059(v=vs.71).aspx

這裏有三篇文章,以幫助擴大你的屬性如何工作的知識。如果你瞭解如何使用它們,最後一點是最不重要的。這篇文章是針對silverlight的,但仍適用於手頭的主題。

Introduction to Attributes

Attributes

DataTypeAttributes

Using Data Annotations w/ silverlight

3

怎麼那麼MVC知道添加 驗證錯誤的模型狀態 字典?

ModelValidatorProvider,更具體地說,是DataAnnotationsModelValidatorProvider。這被MVC調用。

+0

它是在後端還是在前端完成的?我想它是自動創建REST API vor驗證或類似的東西,因爲我在前端看不到任何東西。 – TIKSN

0

因爲您沒有檢查模型是否有效......數據符號檢查模型的有效性。那麼你會得到你的錯誤。

+0

我不檢查模型是否有效的唯一原因是因爲它是2017年,我甚至不記得這一點現在編碼XD – Chev