Asp.net mvc 在ASP.NET MVC 4中获取嵌套级别的视图

Asp.net mvc 在ASP.NET MVC 4中获取嵌套级别的视图,asp.net-mvc,asp.net-mvc-4,asp.net-mvc-partialview,nested-views,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc Partialview,Nested Views,我一直在寻找一种确定视图嵌套级别的方法。我在stackoverflow.com上找到了。但这只适用于渲染,并且只说明它是否为子视图 我想要的是布局具有级别0,在布局中呈现的视图(例如使用@RenderBody)具有级别1,在该视图中呈现的视图(例如使用@Html.Partial)具有级别1。。。有2级 例如: _Layout.cshtml 0 _LoginPartial.cshtml 1 Index.cshtml 1 DataTable.cshtml 2 DataHeader.cshtml 3

我一直在寻找一种确定视图嵌套级别的方法。我在stackoverflow.com上找到了。但这只适用于渲染,并且只说明它是否为子视图

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

例如:

_Layout.cshtml 0 _LoginPartial.cshtml 1 Index.cshtml 1 DataTable.cshtml 2 DataHeader.cshtml 3 DataRow.cshtml 3
有人对此有解决方案吗?

经过调查,我发现了一个静态类System.Web.WebPages.TemplateStack,用于执行视图,在执行前将模板推到堆栈上,执行后弹出,以便使用堆栈的大小来确定级别。没有count变量或任何公共属性/方法来获取实际堆栈。但是,有一个私有方法GetStackHttpContextBase

我使用反射和扩展方法解决了这个问题:

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.WebPages.WebPageBase的ExecutePageHierarchy实现,该实现在RazorView.RenderView中使用的派生类型System.Web.Mvc.WebViewPage中调用

经过一些调查后,我发现了一个静态类System.Web.WebPages.TemplateStack,它在执行视图时使用,在执行前将模板推到堆栈上,然后在执行后弹出,因此可以使用堆栈的大小来确定级别。没有count变量或任何公共属性/方法来获取实际堆栈。但是,有一个私有方法GetStackHttpContextBase

我使用反射和扩展方法解决了这个问题:

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.WebPages.WebPageBase的ExecutePageHierarchy实现,该实现在RazorView.RenderView中使用的派生类型System.Web.Mvc.WebViewPage中调用

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


有关更多详细信息,请参见此处:

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


有关更多详细信息,请参见此处:

我看不出有问题。为什么需要这样做,这样做对代码有什么好处?我这样做的原因是,我已经编写了一个自定义脚本扩展方法,可以对脚本进行排队,解析依赖项,并在以后的布局中呈现。当我测试它时,我发现脚本出现了问题。这是由于视图是如何呈现的,即从最内侧到最外侧。因此,部分视图的脚本首先出现。使用这个嵌套级别,我可以按级别对排队的脚本进行排序并避免这种情况。我可以想出另一个有用的例子,递归部分视图。那么你真的关心javascript包含的优先级系统吗?我看不出有什么问题。为什么需要这样做,这样做对代码有什么好处?我这样做的原因是,我已经编写了一个自定义脚本扩展方法,可以对脚本进行排队,解析依赖项,并在以后的布局中呈现。当我测试它时,我发现脚本出现了问题。这是由于视图是如何呈现的,即从最内侧到最外侧。因此,部分视图的脚本首先出现。使用这个嵌套级别,我可以按级别对排队的脚本进行排序并避免这种情况。我可以想出另一个有用的例子,递归部分视图。那么你真的关心javascript包含的优先级系统吗?太好了!这一切如期而至。我只需要在我的视图ViewContext.getTemplateLevel中调用!这一切如期而至。我只需要在视图ViewContext.GetTemplateLevel中调用