我正在尝试创建一个MVC模型验证属性来填充以下情况:我已经创建了几个模型(Birthday和PhoneNumber是很好的例子),这些模型通过视图上的多个输入字段(月、日、年;区域代码、交换、后缀)提交。
public class PhoneNumber
{
[RegularExpression("^([2-9][0-8][0-9])$", ErrorMessage = "Invalid Area Code")]
public virtual string AreaCode { get; set; }
[RegularExpression("^([2-9][0-9][0-9])$", ErrorMessage = "Invalid Phone Exchange")]
public virtual string Exchange { get; set; }
[RegularExpression("^([0-9][0-9][0-9][0-9])$", ErrorMessage = "Invalid Phone Suffix")]
public virtual string Suffix { get; set; }
}
我经常将这些模型嵌套在其他模型中(例如,Person有一个PhoneNumber和一个生日)。在我看来,有时需要PhoneNumber,有时不需要。我可以通过将类实现为IValidatableObject在服务器端处理这些情况,但如果我想进行客户端验证,或者只是通过属性进行服务器端验证,我就会遇到麻烦。
我想我将不得不构建自己的自定义验证属性,但我甚至不确定从哪里开始在多个层次上访问对象和属性信息。有没有人遇到过这样的事情?有什么好主意给我指明正确的方向吗?
提前感谢!
-更新
通过使用IClientValidatable和GetClientValidationRules,我可以访问ModelMetadata来获取容器的类型。问题是容器是生日或电话号码,而不是顶级模型的类型,这在这里是最重要的。ModelMetadata尚未填充模型属性,因为该属性可能尚不存在。我真正想做的是获取顶级模型的类型。有谁有什么见解吗?
发布于 2012-08-09 03:10:45
根据您编写视图的方式,我认为您可能想要查看一个名为BeginCollectionItem http://nuget.org/packages/BeginCollectionItem的扩展
如果你这样做,验证会变得有点混乱
@Html.TextBoxFor( m => number.AreaCode )
而不是
@Html.TextBoxFor( m => m.AreaCode )
https://stackoverflow.com/questions/11871317
复制相似问题