Причина RuntimeBinderException сработала, я думаю, что есть хороший ответ в других постах.Я просто сосредотачиваюсь, чтобы объяснить, как я на самом деле заставляю это работать.
По ссылке на ответ @DotNetWise и Связывание представлений с коллекцией анонимных типов в ASP.NET MVC ,
СначалаСоздайте статический класс для расширения
public static class impFunctions
{
//converting the anonymous object into an ExpandoObject
public static ExpandoObject ToExpando(this object anonymousObject)
{
//IDictionary<string, object> anonymousDictionary = new RouteValueDictionary(anonymousObject);
IDictionary<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject);
IDictionary<string, object> expando = new ExpandoObject();
foreach (var item in anonymousDictionary)
expando.Add(item);
return (ExpandoObject)expando;
}
}
В контроллере
public ActionResult VisitCount()
{
dynamic Visitor = db.Visitors
.GroupBy(p => p.NRIC)
.Select(g => new { nric = g.Key, count = g.Count()})
.OrderByDescending(g => g.count)
.AsEnumerable() //important to convert to Enumerable
.Select(c => c.ToExpando()); //convert to ExpandoObject
return View(Visitor);
}
В View @model IEnumerable (динамический, а не класс модели), это очень важно, так как мы собираемсядля привязки объекта анонимного типа.
@model IEnumerable<dynamic>
@*@foreach (dynamic item in Model)*@
@foreach (var item in Model)
{
<div>x=@item.nric, y=@item.count</div>
}
Тип в foreach, у меня нет ошибок при использовании var или dynamic .
Byспособ создания новой ViewModel, которая соответствует новым полям, также может быть способом передачи результата в представление.