2012-02-10 55 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