0

我正在尝试创建填充以下情况的 MVC 模型验证属性:我创建了多个模型(生日和电话号码是优秀的示例),这些模型通过视图上的多个输入字段(月、日、年;区号,交换,后缀)。

  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 和一个生日)。在我看来,有时需要电话号码,有时则不需要。我可以通过将类实现为 IValidatableObject 在服务器端处理这些情况,但是如果我想进行客户端验证,甚至只是通过属性进行服务器端验证,我就会遇到麻烦。

我想我将不得不构建自己的自定义验证属性,但我什至不确定从哪里开始访问多个级别的对象和属性信息。有没有人遇到过这样的事情?有什么好主意可以为我指明正确的方向吗?

提前致谢!

- - - - 更新 - - -

通过使用 IClientValidatable 和 GetClientValidationRules,我可以访问 ModelMetadata 可以获取容器的类型。问题是容器是生日或电话号码,而不是顶级模型的类型,这是最重要的。ModelMetadata 尚未填充 Model 属性,因为它可能还不存在。我真正想做的是获得顶级模型的类型。任何人有任何见解?

4

1 回答 1

0

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

如果你正在做,验证会有点混乱

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

代替

@Html.TextBoxFor( m => m.AreaCode )
于 2012-08-08T19:10:45.150 回答