首页 > 解决方案 > 如何显示自定义 404 页面而不是浏览器的默认页面?当我使用我的 Razor Pages 应用程序时

问题描述

如果您在浏览器中键入http://google.com/ShowMeYourCustom404PageEnter ,然后按。您将被重定向到 Google 404 页面。
在此处输入图像描述

如果我们在 github https://github.com/ShowMeYourCustom404Page上应用相同的概念。它将向您显示:
在此处输入图像描述 现在,如果您使用我的 Razor 页面应用程序,它将显示浏览器提供的默认选项。但我不希望这样,我想展示我的自定义 404 Page Error.cshtml
我知道有一个方法调用RedirectToPage()。并且可以在这种情况下使用。

    public IActionResult OnGet(int id)
    {
        if (id <= 0)
            return RedirectToPage("/Error");
        return Page();
    }

但是我不能在不存在的页面上使用`RedirectToPage()`。那么我能做些什么来实现我的目标呢?

标签: asp.net-corerazor-pages

解决方案


根据您的描述,我建议您可以尝试使用自定义中间件来实现您的要求。

您可以检查下一个方法后的状态码,然后将请求路径修改为自定义错误错误页面路径。

更多细节,您可以参考以下代码:

自定义中间件:

    app.Use(async (ctx, next) =>
    {
        await next();

        if (ctx.Response.StatusCode == 404 && !ctx.Response.HasStarted)
        {
            ctx.Request.Path = "/error404";
            await next();
        }
    });

将其添加到 Configure 方法中:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.Use(async (ctx, next) =>
        {
            await next();

            if (ctx.Response.StatusCode == 404 && !ctx.Response.HasStarted)
            {
                ctx.Request.Path = "/error404";
                await next();
            }
        });

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();


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

Error404 剃须刀页面:

@page
@model RazorPageRelated.Pages.Error404Model
@{
    ViewData["Title"] = "Error404";
}

<h1>Error404</h1>

结果:

在此处输入图像描述


推荐阅读