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

时间:2010-08-25 16:52:41

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

公共类UserModel     {             [必需(ErrorMessage =“Le nom est requis。”)]             [UIHint( “字符串”)]             [数据类型(DataType.Text)]             [DisplayName的( “标称”)]             public string姓氏{get;组; }

        [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属性只检查nullable,但Specialty永远不会为null。

编辑:

阅读此帖后http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html 我正在重新提出我的问题:如何防止子属性验证在主对象之前发生。正如您所看到的,SecondarySpeciality不是必需的,但仍然可以在Address类上获得DataAnnotation的验证原因。 我认为mvc2不能用于模型验证。 我应该选择普通型号吗? (这意味着更多的映射,但如果它的工作......)

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

您只需要创建将从RequiredEnumAttribute派生并覆盖ValidationAttribute方法的课程IsValid

示例是可用的here

答案 2 :(得分:0)

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

要使用此功能,您可能需要对提交之前需要进行的属性验证进行放松。