我有一个与资源一起使用的必需属性:
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
。
答案 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 )
);