ExpandoObject, anonymous types and Razor

前端 未结 4 1571
北恋
北恋 2021-01-03 04:16

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          


        
相关标签:
4条回答
  • 2021-01-03 04:31

    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

    0 讨论(0)
  • 2021-01-03 04:32

    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
    
    0 讨论(0)
  • 2021-01-03 04:34

    I stand corrected, @gram has the right idea. However, this is still one way to modify your concept.

    Edit

    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; }
    }
    
    0 讨论(0)
  • 2021-01-03 04:36

    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);
    
    0 讨论(0)
提交回复
热议问题