ASP.NET MVC 2:Data DataAnnotations验证是常规

时间:2010-05-28 20:13:33

标签: asp.net-mvc-2 data-annotations conventions

我有一个与资源一起使用的必需属性:

public class ArticleInput : InputBase
{
    [Required(ErrorMessageResourceType = typeof(ArticleResources), ErrorMessageResourceName = "Body_Validation_Required")]
    public string Body { get; set; }
}

我想指定资源是约定的,如下所示:

public class ArticleInput : InputBase
{
    [Required2]
    public string Body { get; set; }
}

基本上,Required2根据此数据实现值:

ErrorMessageResourceType = typeof(ClassNameWithoutInput + Resources); // ArticleResources
ErrorMessageResourceName = typeof(PropertyName + "_Validation_Required"); // Body_Validation_Required

有没有办法实现这样的目标?也许我需要实现一个新的ValidationAttribute

1 个答案:

答案 0 :(得分:1)

我不认为这是可能的,或者至少在没有为属性提供自定义适配器的情况下也不可能。您在属性的构造函数中没有任何方法可以访问应用该属性的方法/属性。没有它你就无法获得类型或属性名称信息。

如果您为属性创建了适配器,然后使用DataAnnotationsModelValidatorProvider注册它,那么在GetClientValidationRules中,您将可以访问ControllerContext和模型元数据。从中您可以获得正确的资源类型和名称,然后查找正确的错误消息并将其添加到属性的客户端验证规则中。

public class Required2AttributeAdapter
    : DataAnnotationsModelValidator<Required2Attribute>
{
    public Required2AttributeAdapter( ModelMetadata metadata,
                                      ControllerContext context,
                                      Required2Attribute attribute )
        : base( metadata, context, attribute )
    {
    }

    public override IEnumerable<ModelClientValidationRule>
        GetClientValidationRules()
    {
        // use this.ControllerContext and this.Metadata to find
        // the correct error message from the correct set of resources
        //
        return new[] {
            new ModelClientValidationRequiredRule( localizedErrorMessage )
        };
    }
}

然后在global.asax.cs

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof( Required2Attribute ),
    typeof( Required2AttributeAdapter )
);