.net - Blazor 应用程序如何能够在不调用 Startup.cs 中的 MapRazorPages() 的情况下公开 Razor Pages 端点?

标签 .net asp.net-core razor-pages blazor blazor-server-side

在默认的 Razor Pages 项目模板中,Startup.cs 中启用 Razor Pages 的部分代码是对 Configure() 端点配置部分中的 MapRazorPages() 的调用:

app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });

这个调用的必要性在优秀的Introduction to Razor Pages in ASP.NET Core中得到了证实。里克·安德森和瑞安·诺瓦克的文章。

虽然 Blazor 是一种不同的 UI 技术,但 Blazor 项目也能够公开 Razor Pages 端点。例如,包含 ASP.NET 身份验证的 Blazor 项目将登录和注销页面公开为 Razor 页面。

但是,公开 Razor Pages 的 Blazor 项目中的端点初始化似乎并不涉及对 MapRazorPages() 的调用。如果您使用带有个人用户帐户身份验证的默认 Blazor 模板创建一个新项目,然后在 ASP.NET Identity 使用的所有 Razor 页面中搭建脚手架,端点初始化最终将如下所示:

app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });

生成的应用程序能够正确地将请求路由到 Razor Pages 端点,例如 Login.cshtml 和 LogOut.cshtml。如果不调用 MapRazorPages(),这怎么可能?

最佳答案

首先看一下以下代码片段(记下两者中突出显示的行)

引用MapRazorPages

/// <summary>
/// Adds endpoints for Razor Pages to the <see cref="IEndpointRouteBuilder"/>.
/// </summary>
/// <param name="endpoints">The <see cref="IEndpointRouteBuilder"/>.</param>
/// <returns>An <see cref="PageActionEndpointConventionBuilder"/> for endpoints associated with Razor Pages.</returns>
public static PageActionEndpointConventionBuilder MapRazorPages(this IEndpointRouteBuilder endpoints)
{
    if (endpoints == null)
    {
        throw new ArgumentNullException(nameof(endpoints));
    }

    EnsureRazorPagesServices(endpoints); //<-- NOTE THIS

    return GetOrCreateDataSource(endpoints).DefaultBuilder;
}

引用MapFallbackToPage

public static IEndpointConventionBuilder MapFallbackToPage(this IEndpointRouteBuilder endpoints, string page)
{
    if (endpoints == null)
    {
        throw new ArgumentNullException(nameof(endpoints));
    }

    if (page == null)
    {
        throw new ArgumentNullException(nameof(page));
    }

    PageConventionCollection.EnsureValidPageName(page, nameof(page));

    EnsureRazorPagesServices(endpoints); //<-- NOTE THIS

    // Called for side-effect to make sure that the data source is registered.
    GetOrCreateDataSource(endpoints).CreateInertEndpoints = true;

    // Maps a fallback endpoint with an empty delegate. This is OK because
    // we don't expect the delegate to run.
    var builder = endpoints.MapFallback(context => Task.CompletedTask);
    builder.Add(b =>
    {
        // MVC registers a policy that looks for this metadata.
        b.Metadata.Add(CreateDynamicPageMetadata(page, area: null));
    });
    return builder;
}

它们都调用配置功能来处理 razor 页面请求的核心函数。

关于.net - Blazor 应用程序如何能够在不调用 Startup.cs 中的 MapRazorPages() 的情况下公开 Razor Pages 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59806119/

相关文章:

jquery - 无法 POST 到 IHTTPHandler 类,Access-Control-Allow-Origin 不允许来源

.net - 从 WCF 服务调用 asmx Web 服务

c# - ASP.Net Core Content-Disposition 附件/内联

c# - 对数据库的查询返回空或 null 但保存数据确实有效

asp.net-core - 如何在_Layout.cshtml共享Razor页面中添加配置设置

asp.net-mvc - 在脚手架标识后禁用预构建的 Razor UI 页面

c# - 从引用的项目加载 favicon.ico 不起作用(_host.cshtml)

c# - Newtonsoft JSON for .net 忽略 jsonproperty 标签

c# - 如何创建一个在超时后重新发送 HTTP 请求的 Observable 序列?

javascript - jQuery 选择链接在 Chrome 上不起作用