经过一番调查,我发现了一个System.Web.WebPages.TemplateStack
在执行视图时使用的静态类,在执行前将模板推入堆栈并在执行后弹出,因此堆栈的大小可用于确定级别。没有计数变量或任何公共属性/方法来获取实际堆栈。但是有一个私有方法GetStack(HttpContextBase)
。
我通过使用反射和扩展方法解决了它:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.WebPages;
using System.Reflection;
using System.Collections;
namespace Mollwe.Helpers
{
public static class TemplateStackLevelAccessor
{
private static MethodInfo _getStackMethod;
public static int GetTemplateLevel(this HtmlHelper htmlHelper)
{
return GetTemplateLevel(htmlHelper.ViewContext);
}
public static int GetTemplateLevel(this ViewContext viewContext)
{
return GetTemplateLevel(viewContext.HttpContext);
}
public static int GetTemplateLevel(this HttpContextBase httpContext)
{
if (_getStackMethod == null)
{
_getStackMethod = typeof(TemplateStack).GetMethod("GetStack", BindingFlags.NonPublic | BindingFlags.Static);
}
var stack = _getStackMethod.Invoke(null, new object[] { httpContext }) as Stack<ITemplateFile>;
return stack.Count - 1;
}
}
}
也许不是最好的方法,但它有效。由于堆栈在视图的执行中使用,它只能在视图或从视图调用的代码中工作。
依赖于System.Web.WebPages.WebPageBase
的实现ExecutePageHierarchy()
在派生类型System.Web.Mvc.WebViewPage
中被调用,在RazorView.RenderView(...)
.