1

首先让我说我知道还有其他方法可以做到这一点,而且我已经成功地通过其他方式做到了。但我想知道如何@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:“对象”不包含“名字”的定义

断点<h4>显示模型具有数据:

在视图中显示扩展模型的自动变量

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

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

4

1 回答 1

0

简短的回答是不支持使用匿名类型,但是,有一种解决方法,您可以使用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);
}

结果:

在此处输入图像描述

于 2021-03-15T03:25:12.497 回答