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文件夹中。它根本不必位于同一个项目中。