динамический типизированный список в шаблоне бритвы - PullRequest
0 голосов
/ 06 апреля 2011
// this function working perfectly
public dynamic CountTable()
{
    return (from t in db.Users
            group t by t.Type into g
            select new
            {
                type = g.Key,
                count = g.Count(),
                ActiveGroups = (from t in g group t by t.Active into ag select new { active = ag.Key, count = ag.Count() })
            }).ToList();
}

    // and this loop working in MVC Controller
    foreach (dynamic uct in ur.CountTable())
    {
        int x = uct.count;
    }

Но не работает в шаблоне:

Line 12: @foreach (dynamic uct in ViewBag.ur.CountTable())
Line 13: {
Line 14:     int adet = uct.count;
Line 15: }

Строка 14: «объект» не содержит определения «count»

Почему?Что я могу сделать?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Анонимные типы компилируются во внутренние классы.

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

Для получения дополнительной информации см. здесь .

0 голосов
/ 06 апреля 2011

Не могу сказать наверняка, поскольку я никогда не использую динамический, но я подозреваю, что это ситуация, которая не поддерживается механизмом просмотра бритвы. Хотя вы можете иметь динамическую модель и напрямую вызывать свойства для нее.

Например, следующие работы:

@foreach (dynamic uct in new[] { new { Name = "foo" } })
{
    <div>@uct.Name</div>
}

но если мы переместим это в какой-то статический метод где-нибудь еще:

@foreach (dynamic uct in Foo.SomeStaticMethod())
{
    <div>@uct.Name</div>
}

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

Вместо использования динамического я бы порекомендовал вам определить пару типов и работать со строгими типами.

...