asp.net-mvc - 获取 ASP.NET MVC 4 中 View 的嵌套级别

标签 asp.net-mvc asp.net-mvc-4 asp.net-mvc-partialview nested-views

我一直在寻找一种方法来确定 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)

有没有人能解决这个问题?

最佳答案

经过一番调查,我发现了一个静态类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.WebPageBaseExecutePageHierarchy()实现 用于 RazorView.RenderView(...)

关于asp.net-mvc - 获取 ASP.NET MVC 4 中 View 的嵌套级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13398485/

相关文章:

javascript - 连接下拉列表以在 Controller 中运行功能

asp.net - 如何在复杂的嵌套对象上使用 [Bind(Include ="")] 属性?

c# - 在 Json API 调用中卡住了 DateTime 对象名称

javascript - 在 kendo ui 网格中上下滚动时取消选中复选框

asp.net-mvc-3 - 根据下拉列表中的选择动态填充 ASP.NET MVC 3 编辑器模板

asp.net-core - MVC6 中的 Request.IsAjaxRequest() 替代方案

asp.net-mvc - 如何将 asp.net mvc View 呈现为 Angular 2?

jquery - 将图像 src 绑定(bind)为 Knockout 中的表达式

asp.net-mvc - 我的 Godaddy 托管上的 MVC 4 ConnectionString 错误 166

javascript - jquery 无法识别。如何使 Jquery 工作?