我一直在寻找一种方法来确定 View 的“嵌套级别”。我发现:Determine view 'nesting level'在 stackoverflow.com 上。但这仅适用于 RenderAction,并且仅说明它是否是 subview 。
我想要的是布局具有级别 0,在布局中渲染的 View (例如使用 @RenderBody()
)具有级别 1,在该 View 中渲染的 View (例如使用 @Html .Partial(...)
) 的级别为 2。
例如:
- _Layout.cshtml (0)
- _LoginPartial.cshtml (1)
- 索引.cshtml (1)
- DataTable.cshtml (2)
- DataHeader.cshtml (3)
- DataRow.cshtml (3)
- DataTable.cshtml (2)
有没有人能解决这个问题?
最佳答案
经过一番调查,我发现了一个静态类System.Web.WebPages.TemplateStack
,它在执行 View 时使用,在执行前将模板压入堆栈并在执行后弹出,以便堆栈的大小可以用于确定级别。没有计数变量或任何公共(public)属性/方法来获取实际堆栈。然而,有一个私有(private)方法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;
}
}
}
也许不是最好的方法,但它确实有效。由于堆栈是在 View 执行中使用的,因此它只能在 View 或从 View 调用的代码中工作。
依赖于在派生类型System.Web.Mvc.WebViewPage<中调用的
用于 System.Web.WebPages.WebPageBase
的ExecutePageHierarchy()
实现RazorView.RenderView(...)
。
关于asp.net-mvc - 获取 ASP.NET MVC 4 中 View 的嵌套级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13398485/