您希望从这里使用动态类型获得什么好处?
使用 ViewData 字典是向视图输出添加任意对象/项目的一种非常简单的方法。
您不需要反射来获取视图中的属性名称。只需用于ViewData.Keys
获取名称的集合。
编辑:我自己刚刚学到了更多关于动力学的知识,我想也许你需要创建自己的动态对象类,它继承自DynamicObject。您将希望在该类中有一个私有字典,然后覆盖TrySetMember
and TryGetMember
。
编辑旁白:我认为强类型 ViewModel 的一个优点是您可以接受它作为 POST Action 方法中的参数。MVC 框架将处理模型绑定,并且在 action 方法中,您只需拥有 ViewModel 类的实例。我认为即使它们确实有效,您也不会拥有动态的优势。
编辑结果:好吧,我尝试使用从 DynamicObject 派生的类,但是 VS2010 在尝试渲染视图时崩溃。我没有得到任何异常,只是硬崩溃并且 Visual Studio 重新启动。这是我想出的导致崩溃的代码。
自定义动态类:
public class DynViewModel : DynamicObject
{
private Dictionary<string, object> ViewDataBag;
public DynViewModel()
{
this.ViewDataBag = new Dictionary<string, object>();
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.ViewDataBag[binder.Name] = value;
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this.ViewDataBag[binder.Name];
return true;
}
}
在控制器中:
public ActionResult DynamicView()
{
dynamic p = new DynamicViewModel.Models.DynViewModel();
p.Name = "Test";
p.Phone = "111-2222";
return View(p);
}
我的观点与问题中列出的基本相同:
<p>Name: <%=Model.Name %></p>
<p>Phone: <%=Model.Phone %></p>
我的结论:这可能有效,但在 VS2010 的 Beta 1 中,我无法弄清楚为什么我的代码会导致 Visual Studio 崩溃。我将在 VS2010 Beta 2 发布后再次尝试它,因为它是学习动态的有趣练习。但是,即使这可行,我仍然看不到使用 ViewData 字典的任何优势。
菲尔·哈克来救援!这是 Phil Haack 的博客文章,可能会对您有所帮助。看起来这就是你要找的东西。缺少方法和 C# 4 的乐趣