【问题标题】:Asp.Net MVC 2 - Changing the PropertyValueRequired stringAsp.Net MVC 2 - 更改 PropertyValueRequired 字符串
【发布时间】:2025-12-10 20:20:04
【问题描述】:

使用 App_GlobalResources 目录中的 resx 文件,我已经能够更改模型验证器的 PropertyValueInvalid 字符串的默认消息。

但在需要值时无法翻译消息(PropertyValueRequired。)

在 Global.asax.cs Application_Start() 中,我更改了资源类键,如下所示:

DefaultModelBinder.ResourceClassKey = "Messages";

在 Messages.resx 文件中,我输入了两个条目:

  • "PropertyValueInvalid" => "O valor '{0}' é inválido para o campo {1}。"
  • "PropertyValueRequired" = > "É necessário digitar o {0}。"

谢谢。

【问题讨论】:

  • 我注意到了同样的行为。有人解决吗?
  • @mare 您的确切问题是什么 - 在使用数据注释的模态验证中未从 resx 文件中使用 PropertyValueRequired 消息?
  • 是的,正如丹尼尔的问题。
  • 你试过我下面的解决方案了吗?
  • 我觉得达林的好一点,是你解决方案的升级版。

标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-3


【解决方案1】:

RequiredAttribute 未使用 DefaultModelBinder.GetValueRequiredResource。 创建自定义 DataAnnotationsModelValidator 类。

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

并在 Global.asax 中注册适配器。

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

希望对您有所帮助!

Reusable Validation Error Message Resource Strings for DataAnnotations

【讨论】:

  • +1 这正是我一直在寻找的,谢谢! (ps:链接失效)
  • 这是我在这个主题上找到的最佳答案
  • 这很棒。另请参阅此内容以解决您可能遇到的问题*.com/a/16211476/268091
  • 哪里是存储 DataAnnotationsModelValidator 类的最佳实践位置?
  • 这还需要什么命名空间(使用)?
【解决方案2】:

此消息被烘焙到 System.ComponentModel.DataAnnotations 程序集中,位于密钥 RequiredAttribute_ValidationError 下。您可以编写自定义验证属性:

public class MyRequiredAttribute : RequiredAttribute
{
    public MyRequiredAttribute()
    {
        ErrorMessageResourceType = typeof(Messages);
        ErrorMessageResourceName = "Required";
    }
}

然后在您的Messages.resx 文件中定义Required 字符串:

Required => É necessário digitar o {0}.

最后用这个自定义属性装饰你的视图模型属性:

public class MyViewModel
{
    [MyRequired]
    public int Foo { get; set; }
}

【讨论】:

  • 那么对于同一个概念,ASP.NET MVC 团队使用了两种不同的结构?
  • @mare,我们只能希望这在未来的 MVC 版本中会得到修复/变得更容易。
  • 为了在 ASP.NET MVC 3 的客户端上工作,您需要注册自定义属性 (*.com/a/5954452/169) 或使用 AttributeAdapter 方法 (*.com/a/5207912/169)。
【解决方案3】:

怎么样

[Required (ErrorMessageResourceName="Required",ErrorMessageResourceType=typeof(Messages)]

public string Foo { get; set; }

Required => É necessário digitar o {0}.

或者

Required => {0} field is required.

完整的 asp.net mvc 本地化指南请参考以下链接 asp.net mvc localisation guide

【讨论】:

  • 如何使其全局化,因此不需要添加 (ErrorMessageResourceName="Required",ErrorMessageResourceType=typeof(Messages). 或如何为需要整数值但用户生成错误消息的字段输入'abc'
  • 不确定您的意思 - 使其成为全局但对于整数值错误消息 - 这有帮助吗? *.com/questions/9522369/…
【解决方案4】:

就这样添加

[Required(ErrorMessage = "Your Error Message, here..!")]

【讨论】: