动态更改动态数据项目中的数据注释

时间:2013-05-20 07:12:09

标签: c# asp.net entity-framework dynamic t4

我遇到了一个在动态数据Web应用程序中自定义DataAnnotations的场景。这是场景:

[Display(Name="DispName")]
public string DName{get;set;}

我没有为Display DataAnnotation硬编码Name =“DispName”,而是想从DataBase中获取一些值并使其适合于Name属性。像:

[Display(Name=SomeValueFromDB)]    
public string DName{get;set;}

有没有办法从数据库中显示Display DataAnnotation的Name属性而不是硬编码它的值?

另外,如何根据表格值更改 ScaffoldColumn(真/假)

我可以使用T4模板吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

一般来说不是,属性被编译并成为CIL元数据的一部分。为了研究这是一个很好的SO线程,详细介绍了这个主题。 Is it possible to modify the attribute of a property at runtime?

就我个人而言,我认为您应该考虑将标签传递给前端的另一种方式,这样您就可以灵活变通。例如,包含标签和值的模型。

答案 1 :(得分:0)

不久前,在后端设置页面上使用翻译并以客户的语言登录时,我们遇到了类似的问题。

由于我们已经习惯于使用和实现与POEdit软件一起使用的.po翻译库,因此我们选择了这种方式。

我们的属性大部分已经具有自定义属性,称为DisplayName”,我们习惯将其显示在用户控件上。我们将属性更改为TranslatableDisplayName属性,并对其进行了公共重写,以替换.toString()方法,并返回在属性构造函数中设置的名为“ translationKey”的字段。

然后,我们在.po翻译文件中添加了搜索模式“ TranslatableDisplayName:1”,从而导致我们所有的英语显示名称都被使用并列为po文件中的翻译关键字。只需发送这些PO即可将其英语单词/句子翻译成特定的语言,您就可以了。原来超级简单而且有用。

属性示例:

public class TranslatableDisplayName: Attribute
{
    private string translationKey = string.Empty;
    public TranslatableDisplayName(string translationKey)
    {
        this.translationKey = translationKey;
    } 

    public override string toString()
    {
        return Languages.getString(translationKey);
    } 
} 

在我们的例子中,语言是gnugettext Translation c# Library,但可以是处理属性返回值的任何方式。如果需要,只需调用数据库查询。但是,您需要将其作为静态方法使用,除非您在创建软件时通过static属性的属性或方法来提供它,但前提是您是在首次使用它之前。希望这会有所帮助。