Asp.net mvc 3 ExpandoObject、匿名类型和Razor

Asp.net mvc 3 ExpandoObject、匿名类型和Razor,asp.net-mvc-3,dynamic,razor,anonymous-types,expandoobject,Asp.net Mvc 3,Dynamic,Razor,Anonymous Types,Expandoobject,我想使用ExpandooObject作为类型为ViewPage的Razor视图的视图模型。我这样做时会出错 ExpandoObject o = new ExpandoObject(); o.stuff = new { Foo = "bar" }; return View(o); 我可以做些什么来实现这一点?尝试将类型设置为动态 dynamic o = new ExpandoObject(); o.stuff = new { Foo = "bar" }; return View(o); 通过这

我想使用ExpandooObject作为类型为
ViewPage
的Razor视图的视图模型。我这样做时会出错

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

我可以做些什么来实现这一点?

尝试将类型设置为
动态

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

通过这个关于ExpandooObject的精彩演示

我的观点是正确的,@gram的想法是正确的。然而,这仍然是修改概念的一种方法

编辑 你必须给
.stuff
一个类型,因为
动态
必须知道它所处理的对象的类型

.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 o = new ExpandoObject();
o.Stuff = new { Foo = "Bar" }.ToExpando();

return View(o);
然后你的观点是:

@model dynamic

@Model.Stuff.Bar
使用开源软件(在nuget中),你可以用一个非常简单的图形来绘制ExpandoObjects

dynamic Expando=Build.NewObject;
var o=Expando(
资料:Expando(foo:“酒吧”)
);
返回视图(o);

当这纠正编译错误时,您如何能够在视图中访问
@Model.stuff.Foo
<代码>动态对象必须知道它所处理的对象的类型。是的,在我问到这里之前,这几乎就是我结束的地方。如果我需要制作
MyTypedObject
,不妨放弃动态使用,回到强类型的viewmodels:\@qntmfred,我认为@gram的想法是正确的。我测试了代码,它似乎做到了。这肯定更接近于具体回答你的问题。是的,他的方法奏效了。我也对他的答案发表了评论——第一次尝试时我只是做错了一点——结果还是成功了。当我第一次尝试它的时候,它不起作用了。我实际上是在做一些像
ctx.Foo.Select(x=>new{Foo=“bar”}.ToExpandoObject()).SingleOrDefault()
的事情,而我本应该做
ctx.Foo.Select(x=>new{Foo=“bar”}.SingleOrDefault().ToExpandoObject()
  dynamic Expando = Build<ExpandoObject>.NewObject;

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

  return View(o);