Asp.net mvc MVC 4忽略DefaultModelBinder.ResourceClassKey

Asp.net mvc MVC 4忽略DefaultModelBinder.ResourceClassKey,asp.net-mvc,localization,asp.net-mvc-4,model-binding,Asp.net Mvc,Localization,Asp.net Mvc 4,Model Binding,使用PropertyValueRequired键将资源文件添加到App\u GlobalResources,并将DefaultModelBinder.ResourceClassKey更改为文件名对MVC 4没有影响。{0}字段的字符串是必需的从未更改。 我不想在每个必填字段上设置资源类类型和键。 我错过什么了吗 编辑: 我对Darin Dimitrov的代码做了一个小修改,以保持所需的定制工作: public class MyRequiredAttributeAdapter : Required

使用
PropertyValueRequired
键将资源文件添加到
App\u GlobalResources
,并将
DefaultModelBinder.ResourceClassKey
更改为文件名对MVC 4没有影响。{0}字段的字符串
是必需的
从未更改。 我不想在每个必填字段上设置资源类类型和键。 我错过什么了吗

编辑:

我对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";
        }
    }
}

这不是ASP.NET MVC 4特有的。在ASP.NETMVC3中也是如此。无法使用
DefaultModelBinder.ResourceClassKey
设置所需的消息,只有
属性值无效

实现所需功能的一种方法是定义自定义的
RequiredAttributeAdapter

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter
{
    public MyRequiredAttributeAdapter(
        ModelMetadata metadata,
        ControllerContext context,
        RequiredAttribute attribute
    ) : base(metadata, context, attribute)
    {
        attribute.ErrorMessageResourceType = typeof(Messages);
        attribute.ErrorMessageResourceName = "PropertyValueRequired";
    }
}
您将在
应用程序启动中注册的:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(RequiredAttribute),
    typeof(MyRequiredAttributeAdapter)
);

现在,如果未为不可为空的字段分配值,则错误消息将来自
消息。PropertyValueRequired
其中
消息。resx
必须在
应用程序全局资源中定义

完美!我做了很多研究,没有发现类似的东西。非常感谢。是否可以对类型验证执行类似操作,例如日期验证?我们研究了为什么需要适配器:条目GlobalResources.PropertyValueRequired仅用于未标记为“Required”的不可空类型。只能使用此适配器解决方案更改所需的“真实”消息。存在
DataTypeAttributeAdapter
CompareAttributeAdapter
,但与
RequiredAttributeAdapter
不同,它们是内部的。怎么回事?回答得好!我要补充的是,resx文件不必位于App_GlobalResources文件夹中。它根本不必位于同一个项目中。