IValidatableObject和Nullable值类型

时间:2011-04-12 12:03:57

标签: asp.net-mvc-3

我有一个实现IValidatableObject的结构,我将其用于视图模型的属性。验证适用于非可空属性,但是如果添加Nullable <MyStruct&gt;类型的属性永远不会为该属性调用IValidatableObject.Validate方法,即使它具有值。

有没有办法在我的可空属性上触发验证,或者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和Nullable <MyStruct&gt;类型的属性,模型绑定正常。

1 个答案:

答案 0 :(得分: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?“值可以取消装箱到DateTime或IFormattable值。但是它不能分配到DateTime或IFormattable位置。”

因此不返回验证器。

看起来我将不得不采取另一种方式。