いくつかの調査の後、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(...)