我可以在MVC视图中引用type参数吗?

时间:2011-03-29 04:01:10

标签: asp.net-mvc view type-parameter

鉴于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))

之类的事情

3 个答案:

答案 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的类型对象