如何知道 IRazorPage 是否是 IRazorPageActivator.Activate 中的部分视图

How to know if IRazorPage is a partial view in IRazorPageActivator.Activate

有没有办法在自定义 IRazorPageActivator 中识别 IRazorPage 是主页、部分布局还是实际布局?

您拥有的唯一对象是 IRazorPage 和 ViewContext,我搜索了很多但找不到上述信息的任何线索...

你真的没有什么可以用来解决这个问题的。您可以 做的是查看page.Pathcontext.View.Path。如果它们相等,那么您正在渲染实际视图(而不是布局或视图导入)。前者将包含当前正在渲染的视图的路径(例如布局),而后者将仅包含正在渲染的实际视图的路径(例如 Index.cshtml)。

然而,对于偏音,这两者仍然是相等的,因此您将无法以这种方式识别偏音。你可以在那里做的是查看 page.Layout。这将 通常 null 部分。

但是没有一种安全的方法来识别它们,因为 razor 页面激活器根本不应该关心它们。

认为我确实找到了解决方案,但不确定它是否 "hacky" :) 我使用的 UrlHelpers ViewContext 将成为父 ViewContext,并且可以将 ExecutingFilePath 与 context.View.Path 进行比较,后者仅对实际页面(不是部分)相等,因此可以过滤掉部分!

需要更多测试...

public void Activate(IRazorPage page, ViewContext context)
{
    ViewContext viewContext = null;

    if(context.HttpContext.Items.TryGetValue(typeof(IUrlHelper), out var urlHelper) && urlHelper is IUrlHelper)
    {
        viewContext = (ViewContext)((IUrlHelper)urlHelper).ActionContext;
    }

    viewContext = viewContext ?? context;

    // Will only set Layout for the actual page view and only if not allready set
    if(viewContext.ExecutingFilePath.Equals(context.View.Path, StringComparison.OrdinalIgnoreCase) && page.Layout == null)
    {
        page.Layout = "_SpecialLayout";
    }
}