2012-02-10 18 views
2

編輯:似乎很多人認爲這是一個愚蠢的想法,所以我會感謝解釋爲什麼它不好?我試圖做一個局部視圖,可以處理任何模型的列表以表格格式顯示。我計劃擴展它,然後允許配置選項來說出顯示哪些列並在我想出基礎之後添加額外的列。有一個更好的方法嗎?在視圖中使用expando對象?

如何在視圖中使用expando對象列表?我試圖製作一個視圖,它可以顯示我的任何模型列表的表格格式,並且它看起來像expando對象非常適合這一點,但我無法弄清楚如何正確獲取迭代。

我試過使用這些鏈接:Dynamic Anonymous type in Razor causes RuntimeBinderException,ExpandoObject, 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說無法找到類型項目。如果我嘗試item.GetType().GetProperties()不返回任何內容。現在我明白,這些不起作用,因爲類型是動態的,但我怎樣才能動態顯示屬性和值呢?

+3

我並不想成爲一個混蛋,但爲什麼會這樣的設計是一個好主意?像這有什麼好處? – Joe 2012-02-10 15:52:34

+0

@JoeTuskan一個常見的事情是以表格格式顯示項目列表,爲什麼不創建一個可以接受任何類型項目並顯示它的局部視圖?我剛從這裏開始講一個超級基本的例子,因爲我之前從未使用過動態或擴展對象。一旦基本關閉,我還計劃在視圖中掛鉤一些配置選項,以便控制顯示的內容或添加其他內容。看起來好於單獨爲每個班級創建一個。這是一個可怕的方式去做類似的事情嗎? – SventoryMang 2012-02-10 16:06:01

+0

@Joe Tuskan似乎很多人也同意=(。 – SventoryMang 2012-02-10 16:27:39

回答

3

你可以施放ExpandoObject到一個IDictionary,並且做這樣的事情:

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

謝謝,雖然我仍然想聽聽爲什麼很多人認爲這是一個糟糕的想法。 – SventoryMang 2012-02-10 18:08:19

+0

我沒有看到創建通用控件,因爲它本質上是不好的。猜測這取決於你想要達到什麼目的,特別是如果它是像[Datagrid](http://stackoverflow.com/questions/159025/jquery-grid-recommendations)存在的東西;在這種情況下,你可能會重新發明輪子 – 2012-02-10 18:18:24

+0

我明白了,我並沒有意識到有這麼多的選擇,我可以研究這些。 – SventoryMang 2012-02-10 19:35:08

相關問題