鉴于ASP.Net MVC中的强类型视图,是否可以引用用于声明视图的类型参数?
例如,如果页面声明为
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyProject.MyViewModel>" %>
是否可以在ViewPage<TModel>
?
我知道我可以做Model.GetType()
但我有一种情况,我有一个视图模型派生自另一个,并且都使用相同的视图。我目前有一行像
<% if (Model.GetType().IsSubclassOf(typeof(MyViewModel)))
{ %>
检测视图是否用于显示派生模型,但我希望能够在不对typeof(...)
调用进行硬编码的情况下执行此操作。
我想做Model.GetType().IsSubclassOf(typeof(TModel))
答案 0 :(得分:2)
如果您创建自己的基类,则可以通过属性公开模型类型:
public class BaseViewPage<TModel> : ViewPage<TModel>
{
public Type ModelType { get { return typeof(TModel); } }
}
更改
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyProject.MyViewModel>" %>
到
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="MyProject.BaseViewPage<MyProject.MyViewModel>" %>
模型类型通过this.ModelType
公开答案 1 :(得分:1)
来自ViewPage(TModel)上的MSDN文档:
模型 - 获取关联的ViewDataDictionary对象的Model属性。
从模型属性vis Model.GetType()
中抓取类型并不比TModel is typeof(X)
贵。正如Giddy所指出的,在他的评论中,知道TModel的类型没有实际价值,因为你仍然需要进行if比较。
那就是说我会查看你的应用程序架构,因为这里似乎有代码味道。我正在做一个假设,但似乎你正在使用两个不同模型的相同视图,但根据模型的类型显示不同的数据。为了避免这样的问题,我让我的团队遵循one model per view rule。这往往会使您的模型和视图简洁明了。通过有效使用部分内容,您甚至不会感受到约束。
答案 2 :(得分:1)
这应该为您提供TModel
的类型对象的实例this.GetType().BaseType.GetGenericArguments()[0]
.BaseType()是必需的,因为'this'实际上对应于asp.net在运行时为.aspx视图生成的类。
所以this.GetType()。BaseType应该为你提供System.Web.Mvc.ViewPage的类型对象