I want to use an ExpandoObject as the viewmodel for a Razor view of type ViewPage<dynamic>
. I get an error when I do this
ExpandoObject o = new ExpandoObject();
o.stuff = new { Foo = "bar" };
return View(o);
what can I do to make this work?
I want to use an ExpandoObject as the viewmodel for a Razor view of type ViewPage<dynamic>
. I get an error when I do this
ExpandoObject o = new ExpandoObject();
o.stuff = new { Foo = "bar" };
return View(o);
what can I do to make this work?
You can do it with the extension method mentioned in this question:
Dynamic Anonymous type in Razor causes RuntimeBinderException
So your controller code would look like:
dynamic o = new ExpandoObject();
o.Stuff = new { Foo = "Bar" }.ToExpando();
return View(o);
And then your view:
@model dynamic
@Model.Stuff.Bar
Using the open source Dynamitey (in nuget) you could make a graph of ExpandoObjects with a very clean syntax;
dynamic Expando = Build<ExpandoObject>.NewObject;
var o = Expando (
stuff: Expando(foo:"bar")
);
return View(o);
I stand corrected, @gram has the right idea. However, this is still one way to modify your concept.
You have to give .stuff
a type since dynamic
must know what type of object(s) it's dealing with.
.stuff
becomes internal when you set it to an anonymous type, so @model dynamic
won't help you here
ExpandoObject o = new ExpandoObject();
o.stuff = MyTypedObject() { Foo = "bar" };
return View(o);
And, of course, the MyTypedObject
:
public class MyTypedObject
{
public string Foo { get; set; }
}
MyTypedObject
, might as well ditch the dynamic usage and go back to strongly typed viewmodels :\ –
Arabia Try setting the type as dynamic
dynamic o = new ExpandoObject();
o.stuff = new { Foo = "bar" };
return View(o);
Go through this excellent post on ExpandoObject
@Model.stuff.Foo
in the view? dynamic
objects must know the type of object its dealing with. –
Duvetyn © 2022 - 2024 — McMap. All rights reserved.
ctx.Foo.Select(x => new { Foo = "bar" }.ToExpandoObject()).SingleOrDefault()
when I should have been doingctx.Foo.Select(x => new { Foo = "bar" }).SingleOrDefault().ToExpandoObject()
– Arabia