2

我一直在寻找一种方法来确定视图的“嵌套级别”。我发现:在 stackoverflow.com 上确定视图“嵌套级别” 。但这仅适用于RenderAction并且仅说明它是否为子视图。

我想要的是布局具有级别 0,在布局中呈现的视图(例如 with @RenderBody())具有级别 1,在该视图中呈现的视图(例如 with @Html.Partial(...))具有级别 2。

例如:

  • _Layout.cshtml (0)
    • _LoginPartial.cshtml (1)
    • 索引.cshtml (1)
      • 数据表.cshtml (2)
        • 数据头.cshtml (3)
        • 数据行.cshtml (3)

有人对此有解决方案吗?

4

2 回答 2

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(...).

于 2012-11-18T21:42:53.947 回答
0

对于希望在 ASP.Net Core 中执行此操作的任何人,您需要实现自己的ViewResultExecutor. 您可以拦截所有嵌套的“ExecuteAsync()”调用,从而允许构建自己的嵌套级别。

有关更多详细信息,请参见此处:挂钩到 ASP.Net Core 的 razor 页面执行

于 2017-04-07T04:29:03.380 回答