ExpandoObject, анонимные типы и бритва


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

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

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

4 3

4 ответа:

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

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

Таким образом, ваш код контроллера будет выглядеть следующим образом:

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

return View(o);

А затем ваш взгляд:

@model dynamic

@Model.Stuff.Bar

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

  dynamic Expando = Build<ExpandoObject>.NewObject;

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

  return View(o);

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

Edit

Вы должны дать .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; }
}

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

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

Пройдите через этот превосходный пост на ExpandoObject