C# 在视图中使用expando对象?

C# 在视图中使用expando对象?,c#,asp.net-mvc-3,dynamic,razor,expandoobject,C#,Asp.net Mvc 3,Dynamic,Razor,Expandoobject,编辑:似乎很多人都认为这是一个愚蠢的想法,所以我想解释一下为什么它不好?我试图创建一个局部视图,可以处理以表格格式显示的任何模型的列表。我当时正计划扩展它,允许take-config选项在我了解了基本情况后显示哪些列并添加额外的列。有更好的方法吗? 如何在视图中使用expando对象列表?我正在尝试创建一个视图,该视图可以显示我的任何模型列表的表格格式,看起来expando对象非常适合于此,但我不知道如何正确地获得迭代 我尝试使用这些链接:,但它们要么不完整,要么不是我正在做的 以下是我的看法:

编辑:似乎很多人都认为这是一个愚蠢的想法,所以我想解释一下为什么它不好?我试图创建一个局部视图,可以处理以表格格式显示的任何模型的列表。我当时正计划扩展它,允许take-config选项在我了解了基本情况后显示哪些列并添加额外的列。有更好的方法吗?

如何在视图中使用expando对象列表?我正在尝试创建一个视图,该视图可以显示我的任何模型列表的表格格式,看起来expando对象非常适合于此,但我不知道如何正确地获得迭代

我尝试使用这些链接:,但它们要么不完整,要么不是我正在做的

以下是我的看法:

@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>
}
@使用System.Reflection
@模型IList
膨胀试验
@如果(Model.Count>0)
{
@foreach(模型中的动态项)
{
foreach(typeof(item).GetProperties中的var props(BindingFlags.Public | BindingFlags.Static))
{
@props.Name:@props.GetValue(项,空)
}
}
}
我的控制器:

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

        return View(list);
    }
public ActionResult ExpandoTest()
{
IList列表=
EntityServiceFactory.GetService().GetList(null,x=>x.LastName).ToExpando().ToList();
返回视图(列表);
}
扩展方法:

 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();
    }
公共静态IEnumerable-ToExpando(此IEnumerable-anonymousObject)
{
IList list=新列表();
foreach(匿名对象中的var项)
{
IDictionary anonymousDictionary=HtmlHelper.AnonymousObjectToHtmlAttributes(项);
IDictionary expando=新的ExpandoObject();
foreach(匿名字典中的var nestedItem)
expando.Add(nestedItem);
列表。添加(expando);
}
返回列表;
}

expando项目列表正在正确创建,我可以通过调试看到,但是在视图中,它在
typeof(item)
语句中表示无法解析项目,并抛出错误,表示找不到类型项目。如果我尝试
item.GetType().GetProperties()
,则不会返回任何结果。现在我明白了,因为类型是动态的,所以这些都不起作用,但是我如何动态显示属性和值呢?

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

foreach(var prop in item as IDictionary<string, object>)
{
    <tr>
        <td>
            @prop.Key
            @prop.Value
        </td>
    </tr>
}
foreach(项目中的变量prop作为IDictionary)
{
@道具钥匙
@道具价值
}

我不想成为一个混蛋,但为什么这种设计会是一个好主意?像这样做的好处是什么?@JoeTuskan一个常见的做法是以表格格式显示项目列表,那么为什么不创建一个可以接受任何类型的项目并显示它的局部视图呢?我只是从一个超级基本的例子开始,因为我以前从未使用过dynamics或expando对象。一旦基本设置关闭,我还计划将一些配置选项挂接到视图中,以便您可以控制显示的内容,或添加其他内容。似乎比为每个类单独创建一个更好。这是一个可怕的方式去做这样的事情吗?@Joe Tuskan似乎很多人也同意=(.谢谢,不过我还是想听听为什么很多人认为这是一个坏主意。我不认为创建通用控件是一件天生的坏事。我想这取决于你试图用它实现什么,特别是如果它是像a这样的存在;在这种情况下,你可能正在重新发明轮子。我明白了,我不知道有这么多选择。我可以看看这些。