2011-03-29 114 views
1

给定ASP.Net MVC中的强类型视图,是否可以引用用于声明视图的类型参数?我可以在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))

+1

你会怎么其他人来做,没有硬编码'MyViewModel'。即使你可以引用类型参数,你仍然会这样做:if(TModel是typeof(MyViewModel)...“那样的事情。如果你真的想走在这条路上,你可以在'Type'的变量中传递你想检查的类型。 – gideon 2011-03-29 04:16:21

+0

@giddy:我想做类似Model.GetType()。IsSubclassOf(typeof(TModel)) – 2011-03-29 04:20:38

回答

2

如果你创建自己的基类,你可以通过属性暴露模型类型this.ModelType

+0

优雅。我喜欢。谢谢。 – 2011-03-29 22:39:52

1

从MSDN文档上ViewPage(TModel)

模式 - 获取相关的ViewDataDictionary对象的Model属性。

从Model属性中获取类型为Model.GetType()的类型不会比TModel is typeof(X)更昂贵。由于Giddy表示,在他的评论中,知道TModel的类型并没有真正的价值,因为您仍然必须进行比较。

这就是说我会考虑你的应用程序体系结构,因为这里似乎有代码味道。我正在做一个假设,但似乎你正在利用两种不同模型的相同视图,但根据模型的类型显示不同的数据。为了避免这样的问题,我让我的团队遵循one model per view rule。这往往会保持你的模型和观点简洁。通过有效使用偏分量,您甚至不会感受到这种限制。

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>" %> 

的模式类型为通过暴露:

+0

这是一个工作流应用程序,工作流的大多数步骤只需要接受/拒绝和一些评论,但少数需要额外的数据被输入。我有大多数情况下的一个视图模型,以及具有额外数​​据的附加属性的派生模型。这使得控制器保持清洁,工作流程的每个步骤都以相同的方式处理。该视图只需检测是否正在使用派生视图,然后调用关联的分部视图来呈现附加的表单字段。 – 2011-03-29 22:48:13

1

这应该给你的类型对象的实例的TModel

this.GetType().BaseType.GetGenericArguments()[0] 

.BaseType()是必要的,因为“这”实际上对应于在运行时由asp.net您的.aspx视图生成的类。

所以this.GetType()。BASETYPE应该给你的类型对象System.Web.Mvc.ViewPage

+0

+1 - 尼斯和直截了当,但我认为马丁赢得优雅的理由。不管怎么说,还是要谢谢你。 – 2011-03-29 22:41:53

相关问题