Mat*_*ves 12 asp.net-mvc typing dynamic viewpage c#-4.0
这可能吗?这是我正在尝试的:
public ActionResult Index()
{
dynamic p = new { Name = "Test", Phone = "111-2222" };
return View(p);
}
Run Code Online (Sandbox Code Playgroud)
然后我的视图继承System.Web.Mvc.ViewPage<dynamic>并尝试打印出Model.Name.
我收到一个错误:'<> f__AnonymousType1.Name'由于其保护级别而无法访问
所以基本上,我正在尝试做的是不可能的?为什么或者为什么不?
更新:这是我的看法
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<asp:Content ...>
<%=Model.Name%>
<%=Model.Phone%>
</asp:Content>
Run Code Online (Sandbox Code Playgroud)
View构造函数内置于框架中.
方法不能返回匿名类型; 它们仅在定义它们的方法范围内有效.
您应该使用之前定义的Model类并将其传递给View.传递没有定义每个字段的Model类没有任何问题.
更新:
我以前认为我错了.这应该工作.也许问题出在View中.你能发布更多代码吗?特别是View及其构造函数.
更新第二个:
好吧,我把匿名类型传递给另一个用作动态变量的方法是错误的 - 可以这样做.
但我认为你想要做的事情会奏效,我也错了.不幸的是,它不会.问题是你正在使用ViewPage<TModel>,它在ViewDataDictionary<TModel>内部使用.因为它们需要强类型,所以您将无法使用动态对象.内部结构在内部不使用动态,并且在类型失败时指定dynamic.
我们需要的是一个DynamicViewPage类和相应的DynamicViewDataDictionary类,object它在内部接受并存储为动态.然后,您可以使用匿名类型并将其传递给您的视图.
那就是说,你什么都得不到.你可以像你所做的那样指定你的意见(即<%=Model.Name%>),但你不会受益于强类型.没有intellisense,也没有类型安全.你也可以使用ViewDataDictionary@Dennis Palmer建议的无类型.
这是一个有趣的(并且,不幸的是,我吸收)思想实验,但我认为,最终,它不会发生.声明一个公共类型并将其传递给您的视图,或使用无类型字典.
您希望在此处使用动态类型有什么好处?
使用ViewData字典是向视图输出添加任意对象/项的一种非常简单的方法.
您不需要反射来获取视图中的属性名称.只是ViewData.Keys用来获取名称的集合.
编辑:我刚刚学到了更多关于动力学的知识,我想也许你需要创建一个继承自DynamicObject的动态对象类.你想要在该类中有一个私人字典,然后覆盖TrySetMember和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;
}
}
Run Code Online (Sandbox Code Playgroud)
在控制器中:
public ActionResult DynamicView()
{
dynamic p = new DynamicViewModel.Models.DynViewModel();
p.Name = "Test";
p.Phone = "111-2222";
return View(p);
}
Run Code Online (Sandbox Code Playgroud)
我的观点与问题中列出的内容基本相同:
<p>Name: <%=Model.Name %></p>
<p>Phone: <%=Model.Phone %></p>
Run Code Online (Sandbox Code Playgroud)
我的结论:这可能有用,但在VS2010的Beta 1中,我无法弄清楚为什么我的代码会导致Visual Studio崩溃.我将在VS2010 Beta 2中再次尝试它,因为它是一个学习动态的有趣练习.但是,即使这样可行,我仍然看不到使用ViewData字典的任何优势.
菲尔哈克救援!这是Phil Haack的一篇博文,可能会帮助你.它看起来像你在寻找.方法缺失和C#4的乐趣
| 归档时间: |
|
| 查看次数: |
8556 次 |
| 最近记录: |