我遇到了一个在动态数据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模板吗?
提前致谢。
答案 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属性的属性或方法来提供它,但前提是您是在首次使用它之前。希望这会有所帮助。