2011-04-12 83 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位置。”

因此不返回验证器。

看起来我必须以另一种方式做到这一点。