【问题标题】:Use of expando objects in views?在视图中使用 expando 对象?
【发布时间】:2012-02-10 15:48:26
【问题描述】:

编辑:似乎很多人认为这是一个愚蠢的想法,所以我希望能解释一下它为什么不好?我试图制作一个可以处理以表格格式显示的任何模型列表的局部视图。我当时打算扩展它,以便在我弄清楚基础知识后还允许使用配置选项来说明要显示的列并添加额外的列。有没有更好的方法来做到这一点?

如何在视图中使用扩展对象列表?我正在尝试制作一个可以显示我的任何模型列表的表格格式的视图,看起来 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) 语句中解析并抛出错误说找不到类型项目。如果我尝试item.GetType().GetProperties(),它什么也不会返回。现在我知道这些不起作用,因为类型是动态的,但是我怎样才能动态显示属性和值呢?

【问题讨论】:

  • 我不是想成为一个混蛋,但为什么这个设计是个好主意呢?这有什么好处?
  • @JoeTuskan 一个常见的做法是以表格格式显示您的项目列表,那么为什么不创建一个可以获取任何类型项目并显示它的局部视图呢?我只是从一个超级基本的例子开始,因为我以前从未使用过动态或扩展对象。一旦基本完成,我还计划在视图中添加一些配置选项,以便您可以控制显示的内容或添加其他内容。似乎比为每个班级单独创建一个更好。这是一种糟糕的方式来做这样的事情吗?
  • @Joe Tuskan 似乎很多人也同意 =(.

标签: c# asp.net-mvc-3 dynamic razor expandoobject


【解决方案1】:

您可以将 ExpandoObject 转换为 IDictionary,然后执行以下操作:

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

【讨论】:

  • 谢谢,虽然我仍然想听听为什么很多人认为这是一个坏主意。
  • 我不认为创建通用控件本质上是坏事。我想这取决于你想要达到的目标,特别是如果它像Datagrid 这样存在的话;在这种情况下,您可能正在重新发明轮子。
  • 我明白了,我不知道有这么多选择。我可以看看这些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多