8

我遇到了一个在动态数据 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(True/false) ?

我可以使用 T4 模板执行此操作吗?

提前致谢。

4

2 回答 2

2

一般来说,不会,属性被编译并成为 CIL 元数据的一部分。调查这是一个很好的 SO 线程,它详细介绍了这个主题。是否可以在运行时修改属性的属性?

就我个人而言,我认为您应该寻找另一种将标签传递到前端的方法,以便您可以灵活使用。例如,包含标签和值的模型。

于 2013-05-21T07:22:56.677 回答
0

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

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

我们的属性大多已经有自定义属性,称为 DisplayName",我们用来在用户控件上显示标题。我们将这些属性更改为 TranslatableDisplayName 属性,并对其中的 .toString() 方法进行公共覆盖,返回名为“translationKey”,在属性构造函数中设置。

然后,我们将搜索模式“TranslatableDisplayName:1”添加到 .po 翻译文件中,从而使用我们所有的英文显示名称并将其列为 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);
    } 
} 

在我们的例子中, Languages 是一个gnugettext 翻译 c# 库,但可以是处理属性返回的任何方式。如果需要,只需调用您的数据库查询。但是,您需要将其作为静态方法,除非您在创建软件时通过静态属性的属性或方法提供它,但在您第一次需要它之前。希望这可以帮助。

于 2019-06-16T20:52:09.437 回答