我正在尝试创建一个填充以下情况的MVC模型验证属性: 我创建了几个模型(Birthday和PhoneNumber是优秀的例子),这些模型通过视图上的多个输入字段提交(月,日,年; areacode,交换,后缀)。
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和一个Birthday)。有时,在我的观点中,需要一个PhoneNumber,有时则不需要。 我可以通过将类实现为IValidatableObject来处理服务器端的这些情况,但如果我想进行客户端验证,或者甚至只是通过属性进行服务器端验证,我会遇到麻烦。
我想我必须构建自己的自定义验证属性,但我甚至不确定在多个级别访问对象和属性信息的位置。有人遇到过这样的事吗?是否指出了我正确方向的好主意?
提前致谢!
--------更新------
通过使用IClientValidatable和GetClientValidationRules,我可以访问ModelMetadata可以获取容器的类型。问题是容器是生日或电话号码,而不是顶级型号的类型,这是最重要的。 ModelMetadata尚未填充Model属性,因为尚未存在。我真正想做的是获得顶级模型的类型。有人有任何见解吗?
答案 0 :(得分:0)
根据您编写视图的方式,我认为您可能希望查看名为BeginCollectionItem http://nuget.org/packages/BeginCollectionItem的扩展程序
如果您正在进行验证,验证会有点混乱
@Html.TextBoxFor( m => number.AreaCode )
而不是
@Html.TextBoxFor( m => m.AreaCode )