【问题标题】:Client Side Validation on Nested models in ASP.Net MVCASP.Net MVC 中嵌套模型的客户端验证
【发布时间】:2012-08-08 18:59:56
【问题描述】:

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

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

提前致谢!

--------更新-----

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

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

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

    如果你这样做,验证会有点混乱

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

    而不是

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

    【讨论】:

    • 是的,我过去曾使用该扩展来将模型绑定到数组。我在@Html.TextBoxFor(m=>m.PhoneNumber.AreaCode) 中使用过一些技巧,或者使用过“RequiredPhoneNumber”类,但如果我想使用像 IPerson 这样需要电话号码。
    猜你喜欢
    • 2010-09-14
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2023-04-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多