Der Grund für die ausgelöste RuntimeBinderException ist meiner Meinung nach in anderen Beiträgen gut zu beantworten. Ich konzentriere mich nur darauf zu erklären, wie ich es tatsächlich zum Laufen bringe.
Weitere Informationen finden Sie unter Beantworten von @ DotNetWise- und Bindungsansichten mit der Sammlung anonymer Typen in ASP.NET MVC .
Erstellen Sie zunächst eine statische Klasse für die Erweiterung
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;
}
}
In der Steuerung
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);
}
In View, @model IEnumerable (dynamisch, keine Modellklasse) ist dies sehr wichtig, da wir das anonyme Typobjekt binden werden.
@model IEnumerable<dynamic>
@*@foreach (dynamic item in Model)*@
@foreach (var item in Model)
{
<div>x=@item.nric, y=@item.count</div>
}
Bei der Eingabe von foreach habe ich weder bei der Verwendung von var noch bei dynamic einen Fehler .
Wenn Sie ein neues ViewModel erstellen, das mit den neuen Feldern übereinstimmt, können Sie das Ergebnis auch an die Ansicht übergeben.