ASP.Net MVC中嵌套模型的客户端验证

时间:2012-08-08 18:59:57

标签: asp.net-mvc

我正在尝试创建一个填充以下情况的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属性,因为尚未存在。我真正想做的是获得顶级模型的类型。有人有任何见解吗?

1 个答案:

答案 0 :(得分:0)

根据您编写视图的方式,我认为您可能希望查看名为BeginCollectionItem http://nuget.org/packages/BeginCollectionItem的扩展程序

如果您正在进行验证,验证会有点混乱

@Html.TextBoxFor( m => number.AreaCode )

而不是

@Html.TextBoxFor( m => m.AreaCode )
相关问题