Можно ли передать List <dynamic>в ViewBag и интерпретировать в View? - PullRequest
1 голос
/ 17 октября 2011

С помощью ViewBag я могу устанавливать произвольные свойства и получать к ним доступ в виде.Однако, если я создаю список динамических объектов, я не могу получить доступ к свойствам этих объектов.Есть ли способ добиться этого?

Вот базовый пример:

Код контроллера:

List<dynamic> Details = new List<dynamic>();
dynamic detail = new {
    serviceDate = DateTime.Now.ToString("MM/dd/yyyy"),
    Charge = 100.01
};
Details.add(detail);
ViewBag.Details = Details;
return View();

Просмотр кода:

@foreach (dynamic detail in ViewBag.Details) {
     <li>
         @String.Format("{0} - {1}", detail.serviceDate, detail.Charge)
     </li>
}

Исключение, которое я получаю:

'object' не содержит определения для 'serviceDate'

При отладке представления объект явно имеет переменную с именем' serviceDate '

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

Вместо создания анонимного объекта вы можете создать объект расширения, а затем его можно использовать в виде:

dynamic detail = new ExpandoObject();
detail.serviceDate = DateTime.Now.ToString("MM/dd/yyyy");
detail.Charge = 100.01;
0 голосов
/ 22 июля 2015

Спасибо за Анкур.Я столкнулся с той же проблемой, и теперь она решена.

Создайте ExpandoObject и добавьте его в список сведений.

Пример:

Код контроллера:

List<dynamic> Details = new List<dynamic>();
dynamic detail;
detail = new ExpandoObject();
detail.serviceDate = DateTime.Now.ToString("MM/dd/yyyy");
detail.Charge = 100.01;
Details.Add(detail);

detail = new ExpandoObject();
detail.serviceDate = DateTime.Now.ToString("MM/dd/yyyy");
detail.Charge = 50;
Details.Add(detail);

ViewBag.Details = Details;
return View();

Просмотреть код:

@foreach (dynamic detail in ViewBag.Details)
{
    <li>
        @String.Format("{0} - {1}", detail.serviceDate, detail.Charge)
    </li>
}

Вывод:

07-22-2015 - 100.01
07-22-2015 - 50

Другой способ - добавить@model dynamic в верхней части View и используйте return View(Details) в контроллере вместо ViewBag.

0 голосов
/ 17 октября 2011

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

Возможно, вы сможете использовать отражение для получения данных от объекта, но я бы не советовал это. Если вам нужно использовать объект вне области действия метода, я бы создал для него класс, например:

class Detail
{
    public DateTime ServiceDate { get; set; }

    public Decimal Charge { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...