ExpandoObject, анонимные типы и Razor - PullRequest
3 голосов
/ 24 июня 2011

Я хочу использовать ExpandoObject в качестве модели представления для представления Razor типа ViewPage<dynamic>.Когда я это делаю, я получаю сообщение об ошибке

ExpandoObject o = new ExpandoObject();
o.stuff = new { Foo = "bar" };
return View(o);

, что я могу сделать, чтобы эта работа работала?

Ответы [ 4 ]

13 голосов
/ 24 июня 2011

Вы можете сделать это с помощью метода расширения, упомянутого в этом вопросе:

Динамический анонимный тип в Razor вызывает RuntimeBinderException

Итак, ваш код контроллера будет выглядеть так:

dynamic o = new ExpandoObject();
o.Stuff = new { Foo = "Bar" }.ToExpando();

return View(o);

А потом ваше мнение:

@model dynamic

@Model.Stuff.Bar
4 голосов
/ 15 сентября 2011

Используя открытый исходный код Dynamitey (в nuget), вы можете создать граф ExpandoObjects с очень чистым синтаксисом ;

  dynamic Expando = Build<ExpandoObject>.NewObject;

  var o = Expando (
      stuff: Expando(foo:"bar")
  );

  return View(o);
1 голос
/ 24 июня 2011

Я исправлен, у @gram правильная идея. Тем не менее, это еще один способ изменить вашу концепцию.

Редактировать

Вы должны указать .stuff тип, так как dynamic должен знать, с каким типом объектов он имеет дело.

.stuff становится внутренним , когда вы устанавливаете его в анонимный тип, поэтому @model dynamic здесь вам не поможет

ExpandoObject o = new ExpandoObject();
o.stuff = MyTypedObject() { Foo = "bar" };
return View(o);

И, конечно же, MyTypedObject:

public class MyTypedObject
{
    public string Foo { get; set; }
}
0 голосов
/ 24 июня 2011

Попробуйте установить тип как dynamic

dynamic o = new ExpandoObject();
o.stuff = new { Foo = "bar" };
return View(o);

Пройдите эту превосходную запись в ExpandoObject

...