我一直在寻找一种方法来确定视图的“嵌套级别”。我发现:确定视图“嵌套级别” https://stackoverflow.com/questions/4982588/determine-view-nesting-level在 stackoverflow.com 上。但这仅适用于RenderAction
并且只说明它是否是子视图。
我想要的是布局具有级别 0,在布局中呈现的视图(例如,使用@RenderBody()
)的级别为 1,在该视图中呈现的视图(例如,@Html.Partial(...)
) 等级为 2。
例如:
- _Layout.cshtml (0)
- _LoginPartial.cshtml (1)
- Index.cshtml (1)
- DataTable.cshtml (2)
- 数据头.cshtml (3)
- DataRow.cshtml (3)
有人有解决方案吗?
经过一番调查我发现了一个静态类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(...)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)