asp.net-mvc - .NET MVC : Localizing RequiredAttribute (without resource files)

标签 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; }

这有效,但只能一次。

如果您首先访问法语网站,您将看到法语错误消息,指出您应该输入一个值。如果您稍后访问英文网站,您仍然会在英文页面上看到法语错误。 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/

相关文章:

从 MVC 2 升级后,Asp.net MVC 3 无法与 Ninject 一起使用?

javascript - MVC 4使用jquery如何检查模型属性中是否有元素

android - 获取设备中的当前语言

entity-framework - EF 4.4 InverseProperty 并不完全反转

c# - 在代码中添加和删除数据注释

c# - MVC5 路由命名空间优先级

javascript - 无法在 FireFox 中阻止操作链接单击事件

ios - 仅允许针对不同方案/目标的特定翻译

python - 根据值使句子/单词复数

c# - 使用自定义 DataAnnotationsModelValidatorProvider 进行服务器端验证