【问题标题】:Set a non-constant expression as DisplayName将非常量表达式设置为 DisplayName
【发布时间】:2013-08-19 09:50:32
【问题描述】:

我需要动态加载属性的DisplayName(从数据库中)。例如这样的:

[DisplayName(getDescriptionForLanguage("test"))]
public string test{ get; set; }

但只能动态加载DisplayName,只允许使用常量。 有没有办法通过方法而不是从资源文件或常量中获取DisplayName

【问题讨论】:

标签: c# asp.net-mvc


【解决方案1】:

可以调用返回非常量字符串的方法。
您必须创建一个新的属性类,例如这样:

class DisplayNameLanguage : DisplayNameAttribute
{
    private readonly string resourceName;
    public DisplayNameLanguage(string resourceName)
        : base()
    {
        this.resourceName = resourceName;
    }

    public override string DisplayName
    {
        get
        {
            return getDescriptionForLanguage(resourceName);
        }
     }
}

现在您必须创建模型的部分子类。在那里,您可以使用从您的方法getDescriptionForLanguage 获取描述的新属性:

[MetadataType(typeof(TestMD))]
public partial class Test { }
public partial class TestMD
{
    [DisplayNameLanguage("Test")]
    public string Prop1 { get; set; }
}

【讨论】:

    【解决方案2】:

    没有办法改变这种行为。传递给属性的值必须是编译时常量,这意味着即使使用静态类的静态属性也无法解决问题。

    根据 dtb 的建议,您可以停止使用 DisplayName-attribute 来获取显示名称,而是在评估 DisplayName-attribute 值的位置构建自己的机制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      相关资源
      最近更新 更多