如何使用ASP.NET MVC 2验证复杂的模型

问题描述 投票:4回答:2
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
2个回答
1
投票

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


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.