使用数据库中的DisplayName进行MVC4本地化

时间:2014-05-21 12:17:10

标签: c# asp.net asp.net-mvc asp.net-mvc-4 localization

我有一个MVC4网站,其中包含不同的资源文件,本地化工作正常。

但我想要做的是从数据库中获取值,而不是处理resx文件。

我扩展了“DisplayNameAttribute”类以获取键(整数)和CultureInfo对象,并使用它们从数据库中检索值。

我想从CultureInfo获得的是它的字符串表示(例如“en-US”或“fr-FR”)。

我的问题是我可以将整数传递给扩展类的构造函数,但不能传递给CultureInfo。

扩展属性的代码示例:

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
    private int ResourceKey { get; set; }
    private CultureInfo Culture { get; set; }

    public LocalizedDisplayNameAttribute(int resourceKey, CultureInfo culture)
    {
        ResourceKey = resourceKey;
        Culture = culture;
    }

    public override string DisplayName
    {
        get
        {
            string displayName = "Get from database.. TEST";
            return string.IsNullOrEmpty(displayName) ? string.Format("[[{0}]]", ResourceKey) : displayName;
        }
    }

}

我想做什么:

[LocalizedDisplayName(1, Thread.CurrentThread.CurrentUICulture))]  
public string userName  { get; set; } //The full name of the user

甚至更好:

private CultureInfo culture = Thread.CurrentThread.CurrentUICulture;

[LocalizedDisplayName(1, culture))]  
public string userName  { get; set; } //The full name of the user

我的问题是,我该怎么做?

1 个答案:

答案 0 :(得分:0)

这个问题的答案由Ksven首先提供,Tomi Lammi在评论中第二个提供:

由于Thread.CurrentThread.CurrentUICulture不是编译时值,因此无法将其作为LocalizedDisplayName属性的参数提供。因此,解决方案是在属性方法中使用它,而不是将其作为参数提供:

public override string DisplayName
{
   get
   {
        var culture = Thread.CurrentThread.CurrentUICulture; 
        var displayName = db.sp_getValueFromDatabase(id, culture.Name).firstOrDefault();
   }
}

由于我不能接受评论作为公认的答案,我已经做出了自己的答案。如果上述评论者之一可以将他们的解决方案作为答案发布,我将回答他们的答案。