Дисплей Net Core Razor для вызова с отражением

#asp.net-core-mvc

Вопрос:

У меня есть классическая страница индекса MVC с классическим циклом над IEnumerablelt;myclassgt; моделью

 @foreach (var item in Model) {  lt;trgt;  lt;tdgt;@Html.DisplayFor(modelItem =gt; item.name)lt;/tdgt;  lt;!-- .... --gt;  lt;/trgt; }  

В пакете просмотра я получаю Listlt;stringgt; объект, содержащий имена атрибутов myclass , для которых на самом деле отображается столбец.

Идея состоит в том, чтобы поместить внутренний цикл foreach, зацикливающийся на списке:

 @foreach (var item in Model) {  lt;trgt;  @foreach(string c in ViewBag.columns)  {  lt;tdgt;@Html.DisplayFor(???)lt;/tdgt;  }  lt;/trgt; }  

Вопрос в том, как заменить параметр в DisplayFor, так как это лямбда-выражение. Моей первой идеей было использовать отражение

 @foreach(string c in ViewBag.columns)  {  var n = item.GetType().GetProperty(c).GetType();  ParameterExpression p1 = Expression.Parameter(IEnumerablelt;myclassgt;, "modelItem");  ParameterExpression p2 = Expression.Parameter(item.GetType().GetProperty(c).GetType(), "item." c);  Expressionlt;Funclt;IEnumerablelt;myclassgt;, dynamicgt;gt; exResult = Expression.Lambdalt;Funclt;IEnumerablelt;myclassgt;, dynamicgt;gt;(p1, p2);  lt;tdgt;@Html.DisplayFor(exresult)lt;/tdgt;  }  

но это не удается, так как IEnumerablelt;myclassgt; не может использоваться в качестве типа (по каким-либо причинам)

Я тоже пытался, @Html.Display(c, item) но безуспешно.

Есть какие-нибудь предложения?

Комментарии:

1. Я думаю, вы можете объяснить, в каком виде хранятся данные ViewBag и какой внешний вид вы хотите отобразить в представлении….

2. ViewBag.columns представляет собой список строк (как видно из предисловия и описано выше) Модель является IEnumerablelt;myclassgt; , как описано выше.

Ответ №1:

Я не уверен, но если вам нужно что-то вроде ниже?

 lt;trgt;  @foreach (var c in (ViewBag.Columns))  {  lt;tdgt;item.@(c)lt;/tdgt;  }  lt;/trgt;  

Комментарии:

1. К сожалению, нет, так как это просто отображает содержимое item.whatever . Мне на самом деле нужен HTML-код, HTML.DisplayFor(modelItem=gt;item.whatever) который будет генерироваться на основе атрибутов item.whatever