这是我们在.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; }
这有效,但只有一次。
如果您首先使用法语访问该网站,您将看到法语错误消息,指出您应该输入一个值。如果您稍后访问英语网站,您仍会在英文页面上看到法语错误。塞特似乎只被召唤一次。
每次运行验证/使用值填充模型时,我们可以采取哪些措施来防止此行为并刷新错误消息?
感谢您提供任何帮助。
答案 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。