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 (つまり、DisplayName 属性) のこれらの DataAnnotations にアクセスする方法を知りたいです。

<# } #>
@{
  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 には、表示名を取得するために使用できる属性プロパティがあります。

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.NameGetDisplayName()の呼び出しに置き換えることができます。T4 テンプレートは<#= GetDisplayName(viewDataType) #>から返された結果を囲む引用符を生成するため、" <#= viewDataType.Name #> " を囲む引用符も削除しました。

<# 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 に答える