【问题标题】:Dynamically change data annotation in dynamic data project在动态数据项目中动态更改数据注释
【发布时间】:2013-05-20 07:12:09
【问题描述】:

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

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

我想从 DataBase 中获取一些值并适应 Name 属性,而不是硬编码 Name="DispName" 来显示 DataAnnotation。喜欢:

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

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

另外,如何根据表值更改 ScaffoldColumn(True/false)

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      我们的属性大多已经有自定义属性,称为 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 Translation c# Library,但可以是处理属性返回的任何方式。如果需要,只需调用您的数据库查询。但是,您需要将其作为静态方法,除非您在创建软件时通过静态属性的属性或方法提供它,但在您第一次需要它之前。希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多