2012-02-10 9 views
2

編集:これは馬鹿げたアイデアだと多くの人が思っているようですが、なぜそれが悪いのか説明していただければ幸いです。私は、テーブル形式で表示するモデルのリストを処理できる部分的なビューを作成しようとしていました。私は基本的な考え方を見つけた後、表示する列を指定して余分なものを追加するよう設定オプションを取ることもできるようにする予定でした。これを行うより良い方法はありますか?ビューでのexpandoオブジェクトの使用?

どのようにビュー内のexpandoオブジェクトのリストを使用しますか?モデルのリストの表形式を表示できるビューを作成しようとしていますが、expandoオブジェクトはこれに適しているようですが、反復を正しく取得する方法を理解できません。

私はこれらのリンクを使用して試しました:Dynamic Anonymous type in Razor causes RuntimeBinderExceptionExpandoObject, anonymous types and Razorしかし、それらは不完全であるか、私が何をしていないかのようです。ここで

が私の見解です:

@using System.Reflection 
@model IList<dynamic> 

<h2>ExpandoTest</h2> 
@if(Model.Count > 0) 
{ 
    <table> 
     @foreach (dynamic item in Model) 
     { 
      foreach(var props in typeof(item).GetProperties(BindingFlags.Public | BindingFlags.Static)) 
      { 
       <tr> 
        <td> 
         @props.Name : @props.GetValue(item, null) 
        </td> 
       </tr> 
      } 

     } 
    </table> 
} 

マイコントローラ:

public ActionResult ExpandoTest() 
    { 
     IList<dynamic> list = 
      EntityServiceFactory.GetService<UserService>().GetList(null, x => x.LastName).ToExpando().ToList(); 

     return View(list); 
    } 

拡張方法:

public static IEnumerable<dynamic> ToExpando(this IEnumerable<object> anonymousObject) 
    { 
     IList<dynamic> list = new List<dynamic>(); 

     foreach(var item in anonymousObject) 
     { 
      IDictionary<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(item); 
      IDictionary<string, object> expando = new ExpandoObject(); 
      foreach (var nestedItem in anonymousDictionary) 
       expando.Add(nestedItem); 

      list.Add(expando); 
     } 

     return list.AsEnumerable(); 
    } 

はExpando項目のリストが正しく、私がデバッグを通して見ることができます作成​​されていますビューでは、項目はtypeof(item)ステートメントで解決できないと言い、eをスローしますrror say型アイテムが見つかりません。私が何も返さないitem.GetType().GetProperties()を試してみたら。今は、タイプが動的なのでこれらが機能しないことを理解していますが、どうすればそのプロパティと値を動的に表示できますか?

+3

を私はジャークになろうとしないんだけど、なぜこのデザインが良いでしょうか?これの利点は何ですか? – Joe

+0

@JoeTuskanよくあることは、アイテムのリストを表形式で表示することです。どのタイプのアイテムでも表示できる部分ビューを作成して表示してみませんか?私はこれまでダイナミクスやオブジェクトを拡張することは一度もしていないので、ここでは超基本的な例から始めました。ベーシックがダウンしたら、表示されるものを制御したり、追加することができるように、いくつかの設定オプションをビューにフックする予定です。クラスごとに個別に作成するよりも良いと思われます。これは好きなことをやっていくためのひどい方法ですか? – SventoryMang

+0

@ジョー・トスカン多くの人も同意する=(。 – SventoryMang

答えて

3

あなたがたIDictionaryにExpandoObjectをキャスト、そしてこのような何か行うことができます。

foreach(var prop in item as IDictionary<string, object>) 
{ 
    <tr> 
     <td> 
      @prop.Key 
      @prop.Value 
     </td> 
    </tr> 
} 
+1

なぜなら、なぜ多くの人がこれが悪い考えだと思うのか聞いてみたいと思うが、 – SventoryMang

+0

本質的に悪いものとしてジェネリックコントロールを作っているとは思わない。あなたがそのことで達成しようとしていること、特に[Datagrid](http://stackoverflow.com/questions/159025/jquery-grid-recommendations)のような存在であるかどうかに依存していると推測します。 –

+0

私はたくさんの選択肢を認識していなかったので、これらを調べることができます。 – SventoryMang

関連する問題