Asp.net core mvc 如何知道IRazorPageActivator.Activate中的IRazorPage是否为部分视图

Asp.net core mvc 如何知道IRazorPageActivator.Activate中的IRazorPage是否为部分视图,asp.net-core-mvc,asp.net-core-2.2,.net-core-2.2,Asp.net Core Mvc,Asp.net Core 2.2,.net Core 2.2,在自定义IRazorPageActivator中,是否有任何方法可以确定IRazorPage是主页、部分还是实际布局 你唯一拥有的对象是IRazorPage和ViewContext,我搜索了很多,但找不到任何关于上述信息的线索…要想弄清楚这一点,你真的没什么用。您可以做的是查看page.Path和context.View.Path。如果这些值相等,则渲染的是实际视图(而不是布局或视图导入)。前者将包含当前渲染视图的路径(例如布局),而后者仅包含实际渲染视图的路径(例如Index.cshtml)

在自定义IRazorPageActivator中,是否有任何方法可以确定IRazorPage是主页、部分还是实际布局


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

要想弄清楚这一点,你真的没什么用。您可以做的是查看
page.Path
context.View.Path
。如果这些值相等,则渲染的是实际视图(而不是布局或视图导入)。前者将包含当前渲染视图的路径(例如布局),而后者仅包含实际渲染视图的路径(例如
Index.cshtml

但是,对于partials,这两者仍然是相等的,因此您无法以这种方式识别partials。您可以在那里执行的操作是签出
page.Layout
。对于partials,这通常是
null


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

我想我真的找到了一个解决方案,但不确定它是否“黑”了:) Im使用UrlHelpers ViewContext作为父ViewContext,可以将ExecutingFilePath与context.View.Path进行比较,该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";
    }
}

那么,在激活器的链中,你可以访问这些信息的“最近的”在哪里?如何访问这些信息?你真正想要完成的是什么?我实际上在尝试解决几个问题,但最重要的是,通过编程为未设置的全视图设置布局(使查看空布局属性变得困难:)我已经研究了这个链中的几种可能性,但似乎没有一种是合适的,所以可能它只需要在view/viewstart文件中完成……通常,对于设置默认布局,这正是您使用
\u viewstart.cshtml
的目的。它将在任何视图之前执行,因此,除非视图确实显式地设置了布局,否则它将被执行elf,将使用
\u ViewStart.cshtml
中配置的布局。是的,我知道:)但这是我正在开发的工具/框架的特例,对于开发人员来说,这样做很好,因为它涉及一些逻辑。。。