【问题标题】:.NET MVC : Localizing RequiredAttribute (without resource files).NET MVC:本地化RequiredAttribute(没有资源文件)
【发布时间】:2011-03-24 15:35:16
【问题描述】:

这是我们在 .NET MVC 2 中面临的问题。

我们正在尝试使用 DataAnnotations 为我们处理模型验证,就像它应该做的那样。我们遇到的唯一问题是我们不想要标准错误消息(因为我们的网站上有多种语言)。

我们希望将其本地化,但网站的设置方式是所有文本都来自数据库。因此,我们也希望在数据库中包含错误消息。

所以我们写了一个自定义的RequiredAttribute,像这样:

public class LocalizedRequiredAttribute : RequiredAttribute
{   
    public string LocalizedErrorMessage
    {
        get
        {
            return ErrorMessage;
        }
        set
        {
            ErrorMessage = value.Translate();
        }
    }

}

我们为 String 类编写了一个扩展来添加“Translate()”方法,该方法为正确的本地化版本执行必要的数据库查找。

我们像这样使用我们的属性:

[LocalizedRequired(LocalizedErrorMessage = "Naam is required")]
public string Name {get; set; }

这有效,但只有一次。

如果您首先使用法语访问该网站,您会看到法语错误消息,指出您应该输入一个值。如果您稍后访问英文网站,您仍会在英文页面上看到法语错误。 Setter 似乎只被调用一次。

我们可以做些什么来防止这种行为并在每次运行验证/模型填充值时刷新错误消息?

感谢您能给我的任何帮助。

【问题讨论】:

    标签: asp.net-mvc localization data-annotations


    【解决方案1】:

    你不能通过将 .Translate() 从你的 setter 移动到你的 getter 来解决这个问题吗?你的 setter 只被调用一次是有道理的。

    编辑: 我以为 ErrorMessage 是虚拟消息,但事实并非如此。

    您唯一的选择可能是创建从数据库中检索您的值的资源类(您不需要资源文件)。

    [必需(ErrorMessageResourceName="FirstName", ErrorMessageResourceType=typeof(ABCResourceClass))] 公共字符串名称 {get;放; } 类 ABCResourceClass{ 公共静态字符串名字{ 得到{ 返回翻译(“名字”); } } }

    从示例中可以推断,注释框架调用的属性名称与您提供给 ErrorMessageResourceName 的字符串相匹配。

    如果你有很多属性,你可以使用某种代码生成技术来创建 ABCResourceClass。

    【讨论】:

    • 这不起作用,因为似乎从未调用过getter(通过调试应用程序进行测试)。我猜它直接从RequiredAttribute类中调用了“ErrorMessage”。
    • 啊。我期待 ErrorMessage 是虚拟的。事实证明不是。您唯一的选择可能是使用 Resource 类(没有资源文件)。在我用完空间时直接编辑答案
    【解决方案2】:

    只需使用方法FormatErrorMessage()(每次都会调用)来设置ErrorMessage属性

    但它是hackish

    public class ErrorLocalizedRequiredAttribute : RequiredAttribute
    {
        public ErrorLocalizedRequiredAttribute(string name)
        {
            Name = name;
        }
    
        public string Name
        { get; set; }
    
        public override string FormatErrorMessage(string name)
        {
            //get translation from DB by Name
            ErrorMessage = Localization.Translate(Name);
            return base.FormatErrorMessage(name);
        }
    }
    .
    .
    .
    [ErrorLocalizedRequiredAttribute("EmailIsRequired")]
    public string Email
    {
        get; set;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多