Asp.net mvc 3 ExpandoObject、匿名类型和Razor
我想使用ExpandooObject作为类型为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); 通过这
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);