获取 ASP.NET MVC 4 中视图的嵌套级别

2024-04-14

我一直在寻找一种方法来确定视图的“嵌套级别”。我发现:确定视图“嵌套级别” 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(使用前将#替换为@)

获取 ASP.NET MVC 4 中视图的嵌套级别 的相关文章

随机推荐