2011-04-12 75 views
2

我有一個結構,實現IValidatableObject,我用於視圖模型上的屬性。驗證可以使用不可爲空的屬性,但如果添加可爲空類型的屬性>則不會爲該屬性調用IValidatableObject.Validate方法,即使它具有值。IValidatableObject和Nullable值類型

有沒有什麼辦法可以觸發我的可空屬性驗證呢,還是IValidatableObject不打算與值類型一起使用?

感謝


其他信息:

我希望能夠在我的表單中輸入數據時指定單位,例如10米,100公里,1釐米等。我還想驗證輸入的數據是否在範圍內並且格式正確。我的結構將具有潛在不同單位(100cm/100m/1km)的字符串轉換爲總是具有相同單位(1/100/1000)的小數屬性,反之亦然。

我使用了IValidatableObject進行驗證,因爲驗證對於MyStruct的任何實例都是一樣的 - 我不想在每次使用時都添加一個屬性。

我的模型會是這個樣子:

public class MyModel 
{ 
    public MyStruct Ab {get; set;} 
    public MyStruct? Cd {get; set;} 
} 

我的看法是使用模型,這使得我的結構爲使用模板顯示一個文本框,一個強類型的視圖。當表單發佈時,我有一個自定義模型聯編程序將輸入的字符串轉換回我的結構。

我控制器操作是這樣的:

public ActionResult MyAction(MyModel model) 
{ 
    //do stuff 
} 

的模式勢必確定並可空類型<MyStruct的MYSTRUCT性能>。

+0

您能向我們展示迄今爲止您的模型,控制器和視圖的代碼嗎? – 2011-04-12 12:14:53

+0

我更新了更多信息的問題 – Dan 2011-04-12 14:47:06

回答

2

看來這是不可能的。

我挖入MVC源代碼。在System.Web.Mvc.DataAnnotationsModelValidatorProvider有以下代碼:

// Produce a validator if the type supports IValidatableObject 
if (typeof(IValidatableObject).IsAssignableFrom(metadata.ModelType)) { 
    //stuff 
} 

根據this rejected bug reportNullable<T>不能被分配給一個接口,T器具:

「總之,一個」 日期時間? 「可將值解除裝箱到DateTime或IFormattable值,但不能將其分配給DateTime或IFormattable位置。」

因此不返回驗證器。

看起來我必須以另一種方式做到這一點。