如何从资源文件

时间:2017-09-19 03:14:53

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

我已经通过添加Display属性本地化了我的应用程序中属性名称的显示,该属性从resx文件中获取字符串值:

public class ViewLeadViewModel
{
    [Required]
    [Display(Name = "Location", ResourceType = typeof(FormLabels))]
    public string Location { get; set; }
}

这在表单和在基本网格中查看数据时都可以正常工作。

但是,我想使用WebGrid来显示数据,但似乎不支持Display属性,我们只能使用DisplayName(目前列标题只使用属性的实际名称。)

我尝试添加此属性:

[DisplayName(FormLabels.ResourceManager.GetString("Location"))]

但是我收到了错误

  

属性参数必须是属性参数类型

的常量表达式,typeof表达式或数组创建表达式

如何从资源文件本地化WebGrid中的列标题?

更新

以下是Index.cshtml中的代码:

@model IEnumerable<AuroraWeb.Models.ViewLeadViewModel>

@{ 
    var grid = new WebGrid(new List<object>());

    grid = new WebGrid( Model,
                        rowsPerPage: 100);
}

@grid.GetHtml(
    tableStyle: "table",
    alternatingRowStyle: "alternate")

1 个答案:

答案 0 :(得分:1)

您可以创建从DisplayNameAttribute继承的自定义属性类,并通过提供资源键在属性中设置DisplayName字符串属性,如下例所示:

// provided by Brian Schroer
[AttributeUsage(AttributeTargets.Property)]
public class LocalizedDisplayNameAttribute : DisplayNameAttribute 
{
    public LocalizedDisplayNameAttribute(string resourceKey)
    {
        ResourceKey = resourceKey;
    }

    private string ResourceKey { get; set; }

    public override string DisplayName
    {
        get
        {
            string displayName = FormLabels.ResourceManager.GetString(ResourceKey);
            return string.IsNullOrEmpty(displayName) ? string.Format("[[{0}]]", ResourceKey) : displayName;
        }
    }
}

使用示例:

[LocalizedDisplayName("Location")]
public string Location { get; set; }

参考:

ASP.NET MVC localization DisplayNameAttribute alternatives: a good way