I want to use an ExpandoObject as the viewmodel for a Razor view of type ViewPage
. I get an error when I do this
ExpandoObject o
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
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
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; }
}
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);