Редактировать: Кажется, многие думают, что это глупая идея, поэтому я был бы признателен за объяснение, почему это плохо? Я пытался создать одно частичное представление, которое могло бы обрабатывать список любых моделей для отображения в табличном формате. Я планировал расширить его, чтобы потом также использовать параметры конфигурации, чтобы указать, какие столбцы отображать, и добавить дополнительные после того, как я разобрался с основами. Есть ли лучший способ сделать это?
Как использовать список объектов расширения в представлениях? Я пытаюсь создать представление, которое может отображать табличный формат списка любой из моих моделей, и похоже, что объект expando хорошо подходит для этого, но я не могу понять, как правильно получить итерации.
Я пытался использовать эти ссылки: Динамический анонимный тип в Razor вызывает RuntimeBinderException , ExpandoObject, анонимные типы и Razor , но они кажутся либо неполными, либо не такими, как я.
Вот мой взгляд:
@using System.Reflection
@model IList<dynamic>
<h2>ExpandoTest</h2>
@if(Model.Count > 0)
{
<table>
@foreach (dynamic item in Model)
{
foreach(var props in typeof(item).GetProperties(BindingFlags.Public | BindingFlags.Static))
{
<tr>
<td>
@props.Name : @props.GetValue(item, null)
</td>
</tr>
}
}
</table>
}
Мой контроллер:
public ActionResult ExpandoTest()
{
IList<dynamic> list =
EntityServiceFactory.GetService<UserService>().GetList(null, x => x.LastName).ToExpando().ToList();
return View(list);
}
Метод расширения:
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();
}
Список расширенных элементов создается должным образом, что я вижу через отладку, но в представлении он говорит, что элемент не может быть разрешен в операторе typeof(item)
и выдает ошибку, говоря, что элемент типа не может быть найден. Если я попытаюсь item.GetType().GetProperties()
, то ничего не вернется. Теперь я понимаю, что они не работают, потому что тип является динамическим, но как я могу динамически отображать свойства и значения тогда?