2011-10-21 4 views
0

リストテンプレートが尊重している他の属性を使用するべきですか、またはソースをDisplayFor(m => m.someProperty)に手動で変更する必要がありますか?List Scaffold TemplateがDisplayName属性を尊重しないように見えるのはなぜですか?

ExpressionHelper.GetExpressionTextを使用しなければならないという提案を別のスレッドで読みましたが、それは私が探しているものではありません。私はIDEのAdd Viewウィザードを他のスカフォールドテンプレートのようにリストのために働かせたいと思っています。

+0

リストテンプレートは、自動的に '追加View'ダイアログを使用して生成されています足場について話していますか?もしそうなら、実際の 'DisplayFor'は' DisplayFor(m => item.SomeProperty) 'です。 – Buildstarted

+0

右ですが、DisplayForを列見出しに使用することはできません(TH要素は自動的に生成されます)。モデルはIEnumerableであるためです。私が探しているのは、IDEが自動的にDisplayName属性にある正しい名前でヘッダー列を設定するようにすることです。 –

答えて

0

リストが空であり、空のリストで表示名を取得しているタイプのインスタンスにアクセスできないためです。結果として、参照している特定のプロパティへの型付きのアクセスが失われます。あなたはあなたが当然のモデルタイプを受け入れる拡張メソッドを書くことができ

<th>@Html.DisplayFor(f => f...., 
      /* 
       how do you get the property you want to 
       access here if the list is empty 
      */ 
    )</th> 

オブジェクトへのアクセス権を持っていない場合の表示名を使用するプロパティを知っているだろうか。例えば

が、その型付きのアクセスが失われます。

public static IHtmlString DisplayType(this HtmlHelper html, Type modelType, string propertyName) { 
    object modelInstance = Activator.CreateInstance(modelType); 
    var data = ModelMetadata.FromStringExpression(propertyName, 
         new ViewDataDictionary(modelInstance)); 
    return new HtmlString(data.DisplayName ?? propertyName); 
} 


@Html.DisplayType(typeof(CoolModel), "Name") 

私は実際にはお勧めしませんが、

小さなアップデート - あなたはまた、入力されたアクセスせずにも、まだモデル経由でアクセスすることができました:

public static IHtmlString DisplayType<TModel, TValue>(this HtmlHelper<TModel> html, 
      Expression<Func<TModel, TValue>> expression, 
      string propertyName) where TModel : IEnumerable { 
    object modelInstance = 
       Activator.CreateInstance(expression.Body.Type.GetGenericArguments()[0]); 

    var data = ModelMetadata.FromStringExpression(propertyName, 
          new ViewDataDictionary(modelInstance)); 
    return new HtmlString(data.DisplayName ?? propertyName); 
} 
+0

恐ろしいので、ここには百万ドルの質問があります。手動で行う必要がないようにリストビューを自動生成するときに、HtmlHelper拡張機能を生成するためにVisual Studioを拡張するにはどうすればよいですか?それは可能ですか? –

+0

[MvcScaffolding](http://nuget.org/List/Packages/MvcScaffolding)を使って独自のT4テンプレートを作成する必要があります。これは何か、私はごめんなさい、私は少し経験があると思います。詳細はこちらの[ブログ記事](http://blog.stevensanderson.com/2011/01/13/scaffold-your-aspnet-mvc-3-project-with-the-mvcscaffolding-package/)をご覧ください。 – Buildstarted

+0

ありがとう、私は確かにそれを調べます!ところで、インスタンスをインスタンス化する必要がないように、拡張を書き直しました。 –

関連する問題