我一直在寻找一种方法来确定视图的“嵌套级别”。我在stackoverflow.com上找到了Determine view 'nesting level'。但这仅适用于RenderAction
,并且仅表示它是否为子视图。
我想要的是布局的级别为0,布局中呈现的视图(例如,使用@RenderBody()
)具有级别1,在该视图中呈现的视图(例如,使用@Html.Partial(...)
)具有级别2。 / p>
例如:
有人有解决方案吗?
答案 0 :(得分:4)
经过一番调查后,我发现了一个静态类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(...)
的实现。
答案 1 :(得分:0)
对于希望在ASP.Net Core中执行此操作的任何人,您需要实现自己的ViewResultExecutor
。您可以拦截所有嵌套的'ExecuteAsync()'调用,允许建立自己的嵌套级别。
请点击此处了解详情:Hooking into razor page execution for ASP.Net Core