【问题标题】:Using dynamic object in ASP.NET Core MVC view在 ASP.NET Core MVC 视图中使用动态对象
【发布时间】:2021-06-12 07:16:47
【问题描述】:

首先让我说,我知道还有其他方法可以做到这一点,而且我已经通过其他方式成功地做到了。但我想知道如何在视图中使用@model IEnumerable<dynamic>

我在控制器中试过这个:

var result = from p in _db.People
             join ps in _db.PersonSport on p.PersonId equals ps.PersonIdfk
             join s in _db.Sports on ps.SportCodeFk equals s.SportCode
             orderby s.SportName
             where p.LastName == "Orr"
             select new { p.FirstName, p.LastName, s.SportName };
return View(result);

在视图中有这个:

@model IEnumerable<dynamic>
<h4>Sports played by @Model.First().FirstName @Model.First().LastName:</h4>
   @foreach (var item in Model) {
       @item.SportName;<br />
    }

我得到一个运行时错误

RuntimeBinderException:“object”不包含“FirstName”的定义

&lt;h4&gt; 处的断点表明该模型具有数据:

我尝试使用创建结果作为new ExpandoObject() 并得到同样的错误。

我是不是离基地太远了,还是在尝试一些不可能的事情?我在考虑一个用例,您有许多表列但只提取了一些列。是的,我知道我可以创建一个类并这样做,或者在 ViewModel/ViewData 中发送数据,但我想知道这是否是一个选项。

【问题讨论】:

  • 如果在 LINQ 中添加 .ToList&lt;dynamic&gt;() 会发生什么?或将return View(result); 更改为return View(result.ToList&lt;dynamic&gt;());。或者把new { p.FirstName, p.LastName, s.SportName }改成(dynamic)new { p.FirstName, p.LastName, s.SportName }
  • 感谢您的建议。我尝试了所有这些,它们给出了相同的结果。实际上,第二个选项 (return View(result.ToList&lt;dynamic&gt;());) 给出了一个不同的运行时错误,说明该对象不包含 ToList 的方法,但其他两个给出的错误消息与之前相同。
  • 嗨@A.McDonald,有什么更新吗?如果我的回答帮助您解决了您的问题,请记得接受作为答案?如果没有,请您跟进让我知道吗?参考:@ 987654322@.Thanks.

标签: c# visual-studio entity-framework-core asp.net-core-mvc dynamic-view


【解决方案1】:

简短的回答是using anonymous types is not supported,但是there is a workaround,您可以使用ExpandoObject

整个工作演示如下:

  1. 自定义ToExpando方法:
public static class Extension
{
    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();
    }
}
  1. 查看:
    @model IList<dynamic>
    <table class="table">
        <thead>
            <tr>
                <th>FirstName</th>
                <th>LastName</th>
                <th>SportName</th>
            </tr>
        </thead>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @item.FirstName
                </td>
                <td>
                    @item.LastName
                </td> 
                <td>
                    @item.SportName
                </td>
            </tr>
    
        }
    </table>
  1. 控制器:
public IActionResult Index()
{
    var result = (from p in _db.People
             join ps in _db.PersonSport on p.PersonId equals ps.PersonIdfk
             join s in _db.Sports on ps.SportCodeFk equals s.SportCode
             orderby s.SportName
             where p.LastName == "Orr"
             select new { p.FirstName, p.LastName, s.SportName }
             ).ToExpando().ToList();
    return View(result);
}

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多