.NET MVC:本地化RequiredAttribute(没有资源文件)

时间:2011-03-24 15:35:17

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

这是我们在.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; }

这有效,但只有一次。

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

每次运行验证/使用值填充模型时,我们可以采取哪些措施来防止此行为并刷新错误消息?

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:3)

只需使用方法FormatErrorMessage()(每次都调用whis)来设置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;
}

答案 1 :(得分:2)

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

编辑: 我假设ErrorMessage是一个虚拟消息,情况并非如此。

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

[Required(ErrorMesageResourceName="FirstName", ErrorMessageResourceType=typeof(ABCResourceClass))]  
public string Name {get; set; } 

class ABCResourceClass{
  public static String  FirstName{
    get{
        return Translate("FirstName");
    }
  }

}

正如您可以从示例中推断的那样,注释框架使用与您为ErrorMessageResourceName提供的字符串匹配的名称调用该属性。

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