MVC3自定义模板t4和DataAnnotations

时间:2012-09-13 18:40:10

标签: asp.net-mvc templates data-annotations t4 scaffolding

这是我的DataAnnotations模型

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

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

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

改为放置viewDataType.Name我希望得到类MyClass的DisplayName attibute值

由于

2 个答案:

答案 0 :(得分:1)

MVC Scaffolding模板使用Visual Studio对象模型,该模型与标准ASP.NET MVC模板的工作方式不同。 Model.ViewDataType是Visual Studio EnvDTE.CodeType类,而不是Type类。 EnvDTE.CodeType有一个属性属性,可用于获取显示名称。

以下是一些示例代码,可用于从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模板中,您可以通过调用 GetDisplayName()来替换 viewDataType.Name 。我还删除了“&lt;#= viewDataType.Name#&gt; ”周围的引号,因为T4模板会在&lt;#= GetDisplayName(viewDataType)#&gt;返回的结果周围生成引号

<# 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";
}

答案 1 :(得分:0)

<强>更新

我完全删除了我的回答并通过向您提及正在回答您的问题的帖子来回答(并且答案被接受为同时使用)