ExpandoObject,匿名类型和Razor

时间:2011-06-24 14:27:16

标签: asp.net-mvc-3 dynamic razor anonymous-types expandoobject

我想使用ExpandoObject作为类型ViewPage<dynamic>的Razor视图的viewmodel。我这样做时出错了

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

我该怎么做才能使这项工作?

4 个答案:

答案 0 :(得分:13)

您可以使用此问题中提到的扩展方法来执行此操作:

Dynamic Anonymous type in Razor causes RuntimeBinderException

所以你的控制器代码如下:

dynamic o = new ExpandoObject();
o.Stuff = new { Foo = "Bar" }.ToExpando();

return View(o);

然后你的观点:

@model dynamic

@Model.Stuff.Bar

答案 1 :(得分:4)

使用开源Dynamitey(在nuget中)您可以使用非常clean syntax制作ExpandoObjects的图形;

  dynamic Expando = Build<ExpandoObject>.NewObject;

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

  return View(o);

答案 2 :(得分:1)

我的立场得到纠正,@gram有正确的想法。但是,这仍然是修改概念的一种方法。

修改

你必须给.stuff一个类型,因为dynamic必须知道它正在处理什么类型的对象。

当您将其设置为匿名类型时,

.stuff会变为内部,因此@model dynamic将无法帮助您

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

当然还有MyTypedObject

public class MyTypedObject
{
    public string Foo { get; set; }
}

答案 3 :(得分:0)

尝试将类型设置为dynamic

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

在ExpandoObject

上浏览这个优秀的post