这是我们在 .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 似乎只被调用一次。
我们可以采取什么措施来防止这种行为并在每次运行验证/模型填充值时刷新错误消息?
感谢您给我的任何帮助。
最佳答案
你不能通过将 .Translate() 从 setter 移动到 getter 来解决这个问题吗?您的 setter 只被调用一次是有道理的。
编辑: 我以为 ErrorMessage 是一条虚拟消息,但事实并非如此。
您唯一的选择可能是创建从数据库检索值的资源类(您不需要资源文件)。
[Required(ErrorMesageResourceName="FirstName", ErrorMessageResourceType=typeof(ABCResourceClass))] public string Name {get; set; } class ABCResourceClass{ public static String FirstName{ get{ return Translate("FirstName"); } } }
正如您从示例中可以推断的那样,注释框架调用名称与您提供给 ErrorMessageResourceName 的字符串相匹配的属性。
如果您有很多属性,您可以采用某种代码生成技术来创建 ABCResourceClass。
关于asp.net-mvc - .NET MVC : Localizing RequiredAttribute (without resource files),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5421646/