我开始通过添加自定义资源文件并将 ClientDataTypeModelValidatorProvider 和 DefaultModelBinder 绑定到此来本地化默认模型验证错误消息:
ClientDataTypeModelValidatorProvider.ResourceClassKey = "MyModelValidation";
DefaultModelBinder.ResourceClassKey = "MyModelValidation";
然后我发现错误消息 PropertyValueRequired 仅在缺少非可空属性时触发,因此未显示本地化错误消息,例如缺少字符串。为了解决这个问题,我可以使用 ErrorMessageResourceName 和 ErrorMessageResourceType 在相关属性上提供 RequiredAttribute ,让它在自定义资源文件中查找值
全局应用于我所做的所有必需属性:
public class CustomRequiredAttributeAdapter: RequiredAttributeAdapter
{
public CustomRequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute) : base(metadata, context, attribute)
{
attribute.ErrorMessageResourceType = typeof(ModelValidation);
attribute.ErrorMessageResourceName = "PropertyValueRequired";
}
}
protected void Application_Start()
{
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredAttribute), typeof(CustomRequiredAttributeAdapter));
...
}
这样可以正常工作,除非在我有自定义 EditorTemplate 的地方使用自定义数据类型。此处未使用 CustomRequiredAttributeAdapter ,我可以从提供给EditorTemplate的 ModelMetaData 中解析出的唯一数据是默认的英语错误消息。
为什么没有为自定义数据类型调用自定义 RequiredAttributeProvider ?是否可以启用此功能而无需在 RequiredAttributes 中为自定义数据类型显式设置对资源文件的引用?