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无法与模型验证一起使用。我应该只使用普通模型吗? (这意味着要进行更多的映射,但是如果可以的话...)
要对复杂对象进行验证,您需要通过创建自己的验证属性来实现自定义验证。我会举一个简单的例子,但是Phil Haack对此有很棒的文章:
编写您自己的验证器,您可以在其中使用Enum.IsDefined
方法来确定Specialty的值是否设置正确。
您还可以让模型实现IValidatableObject并通过自定义业务规则服务器端进行验证。这使您有机会基于对象的当前状态进行条件验证。如果属性x = 1,则需要y ...