【问题标题】:Can I determine the model of a strongly typed ASP.NET MVC view before it is executed?我可以在执行强类型 ASP.NET MVC 视图之前确定它的模型吗?
【发布时间】:2014-05-07 06:46:48
【问题描述】:

我想在执行视图之前从(强类型)ASP.NET MVC 4 视图中确定视图模型类型。我的控制器逻辑使我能够确定视图名称,从而以编程方式加载视图,但似乎没有任何关于模型类型的线索:

var res = ViewEngines.Engines.FindPartialView(this.ControllerContext, viewName);
if (res.View != null)
{
     Type modelType = res.View.GetType(); //returns System.Web.Mvc.RazorView 
     //...so it would be great to be able to do:
     modelType = res.View.GetModelType();//...but this does not exist
}

我想这样做的原因是因为我自动将我的域模型映射到视图模型 - 请求包含我可以从中派生视图名称的信息,但不是视图模型类型,所以我想从视图以进行模型映射。

【问题讨论】:

  • 你在哪里做的?在那个阶段,视图还没有被编译。当您获得WebViewPage 类型的对象时,您可以确定视图是否是通用的
  • 您应该知道控制器中将要绑定到视图的对象和要渲染的视图。你不能从另一个中推断出一个。如果你必须这样做,你可能做错了什么。
  • 如果您有单独的域和视图模型,我认为这不一定是正确的

标签: asp.net-mvc asp.net-mvc-viewmodel


【解决方案1】:

这样就可以解决问题(我在控制器中验证了这一点,但它也可以在过滤器中运行)。

** 请注意,这适用于默认视图引擎/默认视图页面,否则可能需要调整,它不会以任何方式强化,只是为了显示模式

Type modelType = null;

var view = ViewEngines.Engines.FindView(this.ControllerContext, "Index", string.Empty);

var bmView = (BuildManagerCompiledView)view.View;

// this need caching, no reason to call build manager again and again.
var razorView = BuildManager.GetCompiledType(bmView.ViewPath);

// this doesn't allow for customizing the page type (but not a common scenario)
if (typeof(WebViewPage).IsAssignableFrom(razorView) && razorView.BaseType.IsGenericType)
{
    modelType = razorView.BaseType.GetGenericArguments()[0];
}

【讨论】:

  • 效果很好。尽管我只对获取通用参数(即模型类型)感兴趣,但不管视图本身的类型如何,我都不会费心检查它是否是 WebViewPage。我也缓存了这个,所以它只在第一次请求特定视图时执行
  • 把它放在一个过滤器中是个好主意——它是一个通用的过程(找到一个视图的模型并将域模型映射到这个类型)——把它放在一个过滤器中可以更容易地重用和转向开/关
  • @Will 在您的应用程序中不检查基本类型是可以的,如果您从不混合 aspx 页面或具有自定义基本类型。如果您使用自定义基类型,则泛型参数可能不是第一个。但这是一个极端情况,我倾向于同意你的做法。
【解决方案2】:

你可以这样做:

//viewName can be "~/Views/Account/Login.cshtml"
var type = BuildManager.GetCompiledType(viewName); 
bool isGeneric = type.BaseType.IsGenericType;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多