2

ビューの「ネストレベル」を決定する方法を探していました。私が見つけた:stackoverflow.comでビューの「ネストレベル」を決定してください。しかし、RenderActionそれは子ビューであるかどうかだけで機能し、そうではありません。

私が望むのは、レイアウトにはレベル 0 があり、レイアウトでレンダリングされたビュー (たとえば with @RenderBody()) はレベル 1、そのビューでレンダリングされたビュー (たとえば with @Html.Partial(...)) はレベル 2 です。

例えば:

  • _Layout.cshtml (0)
    • _LoginPartial.cshtml (1)
    • インデックス.cshtml (1)
      • DataTable.cshtml (2)
        • DataHeader.cshtml (3)
        • DataRow.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.WebViewPageRazorView.RenderView(...)

于 2012-11-18T21:42:53.947 に答える