编辑:似乎很多人都认为这是一个愚蠢的想法,所以我很感激解释为什么它不好?我试图制作一个部分视图,可以处理以表格格式显示的任何模型的列表。我正计划扩展它,然后允许使用配置选项来说明要显示的列,并在我弄清楚基础知识后添加额外的列。有更好的方法吗?
如何在视图中使用expando对象列表?我正在尝试创建一个可以显示任何模型列表的表格格式的视图,看起来expando对象非常适合这种情况,但我无法弄清楚如何正确地进行迭代。 / p>
我尝试使用这些链接: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)
语句中解析项目并抛出错误,说明无法找到类型项目。如果我尝试item.GetType().GetProperties()
则不返回任何内容。现在我明白这些不起作用,因为类型是动态的,但我怎么能动态显示属性和值呢?
答案 0 :(得分:3)
您可以将ExpandoObject强制转换为IDictionary,并执行以下操作:
foreach(var prop in item as IDictionary<string, object>)
{
<tr>
<td>
@prop.Key
@prop.Value
</td>
</tr>
}