我有一个实现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;类型的属性,模型绑定正常。
答案 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 report,Nullable<T>
无法分配给T
实现的接口:
“简而言之,”DateTime?“值可以取消装箱到DateTime或IFormattable值。但是它不能分配到DateTime或IFormattable位置。”
因此不返回验证器。
看起来我将不得不采取另一种方式。