【问题标题】:How can I validate a complex model using ASP.NET MVC 2如何使用 ASP.NET MVC 2 验证复杂模型
【发布时间】:2010-08-25 16:52:40
【问题描述】:
public class UserModel
    {
            [Required(ErrorMessage = "Le nom est requis.")]
            [UIHint("String")]
            [DataType(DataType.Text)]
            [DisplayName("Nom")]
            public string Lastname { get; set; }

            [DataType(DataType.Text)]
            [UIHint("String")]
            [DisplayName("Prénom")]
            public string Firstname { get; set; }

            [Required(ErrorMessage="La spécialité principale est requise.")]
            [DisplayName("Spécialité principale")]
            public Speciality PrimarySpeciality { get; set; }

            [DisplayName("Spécialité secondaire")]
            public Speciality SecondarySpeciality { get; set; }
    }

    public class SpecialityModel
    {
        [Required(ErrorMessage = "La spécialité est requise.")]
        public int Id { get; set; }

        public string Name { get; set; }
    }

怎么可能需要主要专长而不是第二专长? 似乎Required 属性只检查是否可以为空,但Specialty 永远不会为空。

编辑:

看完这篇文章http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html 我正在重新制定我的问题:如何防止在主对象之前发生子属性验证。正如您所看到的,SecondarySpeciality 不是必需的,但仍然得到了 Address 类上 DataAnnotation 的验证原因。 我认为 mvc2 不能与模型验证一起使用。 我应该只用普通型号吗? (这意味着更多的映射,但如果它有效的话......)

【问题讨论】:

    标签: asp.net-mvc validation asp.net-mvc-2


    【解决方案1】:

    要对复杂对象进行验证,您需要通过创建自己的验证属性来实现自定义验证。我会打出一个简单的例子,但 Phil Haack 有一篇很棒的文章:

    http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

    【讨论】:

    【解决方案2】:

    编写您自己的验证器,您可以在其中使用Enum.IsDefined 方法来确定Specialty 的值是否设置正确。

    您只需要创建将派生自ValidationAttribute 的类RequiredEnumAttribute 并覆盖IsValid 方法。

    示例是可用的here

    【讨论】:

      【解决方案3】:

      您还可以让您的模型实现 IValidatableObject 并使用自定义业务规则服务器端进行验证。这使您有机会根据对象的当前状态进行条件验证。如果属性 x = 1,则需要 y...

      要使用它,您可能需要在提交之前放松对属性的验证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        相关资源
        最近更新 更多