2

这是我的带有 DataAnnotations 的模型

[DisplayName("Title1"),Display(Name="Title2")]
public class MyClass
{
  [Display(Name = "My Class Name")]
  public string class_name { get; set; }
}

我想知道如何在我的 T4 模板 Index.cs.t4 中访问 MyClass 类的这些 DataAnnotations(即 DisplayName 属性)

<# } #>
@{
  ViewBag.Title = "<#= viewDataType.Name   #>";
  <# if (!String.IsNullOrEmpty(Model.Layout)) { #>
  Layout = "<#= Model.Layout #>";
<# } #>
}

而是放置 viewDataType.Name 我想拥有 MyClass 类的 DisplayName 属性的值

谢谢

4

2 回答 2

1

MVC 脚手架模板使用不同于标准 ASP.NET MVC 模板工作方式的 Visual Studio 对象模型。Model.ViewDataType 是 Visual Studio EnvDTE.CodeType类而不是Type类。EnvDTE.CodeType 具有可用于获取显示名称的 attributes 属性。

下面是一些示例代码,可用于从 CodeType 获取显示名称。您可以将此代码放在自定义 T4 模板 (Index.cs.t4) 的末尾。

<#+
string GetDisplayName(EnvDTE.CodeType type) {
    if (type != null) {
        foreach (var attribute in type.Attributes.OfType<EnvDTE.CodeAttribute>()) {
            if (attribute.Name == "DisplayName") {
                return attribute.Value;
            }
        }
    }
    return "";
}
#>

然后在您的自定义 T4 模板中,您可以将viewDataType.Name替换为对GetDisplayName()的调用。我还删除了“ <#= viewDataType.Name #> ”周围的引号,因为 T4 模板会围绕从<#= GetDisplayName(viewDataType) #>返回的结果生成引号。

<# var viewDataType = (EnvDTE.CodeType) Model.ViewDataType; #>
<# if(viewDataType != null) { #>
@model IEnumerable<<#= viewDataType.FullName #>>
<# } #>
@{
    ViewBag.Title = <#= GetDisplayName(viewDataType) #>;
<# if (!String.IsNullOrEmpty(Model.Layout)) { #>
    Layout = "<#= Model.Layout #>";
<# } #>
}

如果您随后删除您的 Index.cshtml 视图并使用脚手架重新创建它,您应该会在 ViewBag.Title 中设置显示名称。

@{
    ViewBag.Title = "Title1";
}
于 2012-09-16T13:24:35.583 回答
0

更新

我完全删除了我的答案和回答,让您参考准确回答您问题的帖子(并且答案被接受为适用于两者)

于 2012-09-14T14:44:45.290 回答