c# - 在 View 中使用 expando 对象?

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

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

如何在 View 中使用一系列 expando 对象?我正在尝试制作一个可以显示我的任何模型列表的表格格式的 View ,看起来 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>
}

我的 Controller :

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 项目列表正在正确创建我可以通过调试看到,但在 View 中它说项目无法在 typeof(item) 语句中解析并抛出错误说类型项目无法找到。如果我尝试 item.GetType().GetProperties() 什么都不返回。现在我明白这些不起作用,因为类型是动态的,但是我怎样才能动态显示属性和值呢?

最佳答案

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

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

关于c# - 在 View 中使用 expando 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9230512/

相关文章:

c# - 硬币数量有限的最小硬币找零问题

python - 如何使用内联 if 语句打印?

javascript - 通过 AJAX 发送 ASP.NET 模型

c - 需要为 2D 元组数组和未知大小的 2D 指针数组分配内存?

c# - 信号量动态调整大小 C#

c# - 不同的 Http 404 - 从 Controller 返回

c# - 为什么日期结构是不可变的?

c# - 将文件下载到客户端浏览器,卡在 Response.End()

asp.net - DropDownList对于未选择值的集合

asp.net - 在 ASP.NET MVC 3 中获取 ContentType