Использование объектов Expando в представлениях?

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

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


person SventoryMang    schedule 10.02.2012    source источник
comment
Я не пытаюсь быть придурком, но почему этот дизайн может быть хорошей идеей? Каковы преимущества этого?   -  person Joe    schedule 10.02.2012
comment
@JoeTuskan Обычной задачей является отображение списка элементов в формате таблицы, так почему бы не создать частичное представление, которое может принимать элементы любого типа и отображать их? Я только начал с очень простого примера, так как никогда раньше не работал с динамическими или расширяемыми объектами. После того, как основная часть будет отключена, я также планирую подключить некоторые параметры конфигурации к представлению, чтобы вы могли контролировать то, что отображается, или добавлять дополнительные вещи. Кажется лучше, чем создавать по одному для каждого класса по отдельности. Это ужасный способ делать что-то подобное?   -  person SventoryMang    schedule 10.02.2012
comment
@Joe Tuskan Кажется, многие люди тоже согласны =(.   -  person SventoryMang    schedule 10.02.2012


Ответы (1)


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

foreach(var prop in item as IDictionary<string, object>)
{
    <tr>
        <td>
            @prop.Key
            @prop.Value
        </td>
    </tr>
}
person Felipe Castro    schedule 10.02.2012
comment
Спасибо, хотя я все же хотел бы услышать, почему многие люди думают, что это плохая идея. - person SventoryMang; 10.02.2012
comment
Я не считаю создание универсальных элементов управления чем-то изначально плохим. Я думаю, это зависит от того, чего вы пытаетесь достичь, особенно если это что-то существующее, например Datagrid; в этом случае вы можете заново изобретать колесо. - person Felipe Castro; 10.02.2012
comment
Понятно, я не знал о таком количестве вариантов. Я могу посмотреть на это. - person SventoryMang; 10.02.2012