MVC 4忽略DefaultModelBinder.ResourceClassKey

Edu*_*rdo 21 asp.net-mvc localization model-binding asp.net-mvc-4

App_GlobalResources使用PropertyValueRequired密钥添加资源文件并更改DefaultModelBinder.ResourceClassKey为文件名对MVC 4没有影响.字符串The {0} field is required永远不会更改.我不想在每个必填字段上设置资源类类型和键.我错过了什么吗?

编辑:

我对Darin Dimitrov的代码进行了一些小修改,以保持必需的自定义工作:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter
{
    public MyRequiredAttributeAdapter(
        ModelMetadata metadata,
        ControllerContext context,
        RequiredAttribute attribute
    )
        : base(metadata, context, attribute)
    {
        if (attribute.ErrorMessageResourceType == null)
        {
            attribute.ErrorMessageResourceType = typeof(Messages);
        }
        if (attribute.ErrorMessageResourceName == null)
        {
            attribute.ErrorMessageResourceName = "PropertyValueRequired";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 40

这不是特定于ASP.NET MVC 4.它在ASP.NET MVC 3中是相同的.您不能使用DefaultModelBinder.ResourceClassKey仅设置所需的消息PropertyValueInvalid.

实现您所需要的一种方法是定义自定义RequiredAttributeAdapter:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter
{
    public MyRequiredAttributeAdapter(
        ModelMetadata metadata,
        ControllerContext context,
        RequiredAttribute attribute
    ) : base(metadata, context, attribute)
    {
        attribute.ErrorMessageResourceType = typeof(Messages);
        attribute.ErrorMessageResourceName = "PropertyValueRequired";
    }
}
Run Code Online (Sandbox Code Playgroud)

你将注册Application_Start:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(RequiredAttribute),
    typeof(MyRequiredAttributeAdapter)
);
Run Code Online (Sandbox Code Playgroud)

现在,当一个不可为空的字段没有赋值时,错误信息将来自必须在里面定义的Messages.PropertyValueRequired地方.Messages.resxApp_GlobalResources

  • 很棒的答案!我将补充说,resx文件不必位于App_GlobalResources文件夹中.它根本不必位于同一个项目中. (2认同)