ExpandoObject, анонимные типы и бритва
Я хочу использовать ExpandoObject в качестве viewmodel для представления Razor типа ViewPage<dynamic>
. Я получаю ошибку, когда делаю это
ExpandoObject o = new ExpandoObject();
o.stuff = new { Foo = "bar" };
return View(o);
Что я могу сделать, чтобы это сработало?
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