Использование объектов расширения в представлениях? - PullRequest
2 голосов
/ 10 февраля 2012

Редактировать: Кажется, многие думают, что это глупая идея, поэтому я был бы признателен за объяснение, почему это плохо? Я пытался создать одно частичное представление, которое могло бы обрабатывать список любых моделей для отображения в табличном формате. Я планировал расширить его, чтобы потом также использовать параметры конфигурации, чтобы указать, какие столбцы отображать, и добавить дополнительные после того, как я разобрался с основами. Есть ли лучший способ сделать это?

Как использовать список объектов расширения в представлениях? Я пытаюсь создать представление, которое может отображать табличный формат списка любой из моих моделей, и похоже, что объект 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(), то ничего не вернется. Теперь я понимаю, что они не работают, потому что тип является динамическим, но как я могу динамически отображать свойства и значения тогда?

1 Ответ

3 голосов
/ 10 февраля 2012

Вы можете привести ExpandoObject к IDictionary и сделать что-то вроде этого:

foreach(var prop in item as IDictionary<string, object>)
{
    <tr>
        <td>
            @prop.Key
            @prop.Value
        </td>
    </tr>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...