首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IValidatableObject和可空值类型

IValidatableObject和可空值类型
EN

Stack Overflow用户
提问于 2011-04-12 12:03:56
回答 1查看 552关注 0票数 2

我有一个实现IValidatableObject的结构,用于视图模型上的属性。验证对于非空属性很好,但是如果添加类型为Nullable<MyStruct>的属性,则永远不会为该属性调用IValidatableObject.Validate方法,即使它有一个值。

是否也有任何方式触发对可空属性的验证,或者IValidatableObject不打算与值类型一起使用?

谢谢

其他信息:

我希望在以我的形式输入数据时能够指定单位,例如10米、100公里、1厘米等。我还想确认输入的数据是否在范围之内,格式是否正确。我的结构将具有潜在不同单位(100 My /100 m/1km)的字符串转换为一个十进制属性,该属性始终具有相同的单位(1/100/1000),反之亦然。

我使用IValidatableObject进行验证,因为对于MyStruct的任何实例,验证总是相同的--我不想每次使用它时都添加一个属性。

我的模特看起来会是这样的:

代码语言:javascript
复制
public class MyModel 
{
    public MyStruct Ab {get; set;}
    public MyStruct? Cd {get; set;}
}

我的视图是一个使用模型的强类型视图,它使用显示模板将我的结构呈现为文本框。当表单发布时,我有一个自定义的模型绑定程序将输入的字符串转换回我的结构。

我的控制器操作如下:

代码语言:javascript
复制
public ActionResult MyAction(MyModel model)
{
    //do stuff
}

该模型为MyStruct和Nullable<MyStruct>类型的属性绑定ok。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-14 17:09:23

看来这是不可能的。

我深入研究了MVC源代码。在System.Web.Mvc.DataAnnotationsModelValidatorProvider中有以下代码:

代码语言:javascript
复制
// Produce a validator if the type supports IValidatableObject
if (typeof(IValidatableObject).IsAssignableFrom(metadata.ModelType)) {
    //stuff
}

根据这个被拒绝的错误报告,不能将Nullable<T>分配给T实现的接口:

简而言之,可以将" DateTime ?“值解压缩到DateTime或IFormattable值,但不能将其分配给DateTime或IFormattable位置。

因此,不返回验证器。

看来我得换个办法了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5634874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档