You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 7.0带消息状态码无法跳转默认错误页求助

解决方案

1. 调整Program.cs的错误处理中间件配置

在.NET 7中,默认的UseStatusCodePages不会自动处理带自定义消息的状态码响应,需改用UseStatusCodePagesWithReExecute确保状态码请求被转发到错误页面,同时保留原始状态码与请求信息。注意中间件顺序必须正确,要放在路由配置前:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    // 捕获未处理异常,转发到错误页面
    app.UseExceptionHandler("/Home/Error");
    // 用ReExecute模式保留原始状态码,避免丢失请求上下文
    app.UseStatusCodePagesWithReExecute("/Home/Error/{0}");
}
else
{
    app.UseDeveloperExceptionPage();
}

app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

2. 修改HomeController的Error方法

让Error方法接收状态码参数,并支持获取自定义错误消息:

using Microsoft.AspNetCore.Mvc;

public class HomeController : Controller
{
    // 其他业务方法...

    public IActionResult Error(int? statusCode = null)
    {
        // 从TempData获取自定义错误消息(需在返回状态码时存入)
        var errorMessage = TempData["ErrorMessage"] as string ?? "请求发生错误";
        
        ViewData["StatusCode"] = statusCode;
        ViewData["ErrorMessage"] = errorMessage;

        return View();
    }
}

3. 正确返回带消息的状态码

在控制器中返回状态码时,通过TempData传递自定义消息:

public IActionResult InvalidSubmit()
{
    TempData["ErrorMessage"] = "提交的参数格式不正确,请检查后重试";
    return StatusCode(StatusCodes.Status400BadRequest);
}

4. 错误视图(Error.cshtml)示例

在Views/Home/Error.cshtml中展示状态码与错误消息:

@{
    ViewData["Title"] = "错误提示";
}

<h2 class="text-danger">错误代码:@ViewData["StatusCode"]</h2>
<p>@ViewData["ErrorMessage"]</p>

关键说明

  • UseStatusCodePagesWithReExecute是核心:它会重新执行错误页面的动作方法,而非简单重定向,能完整保留原始请求的状态码与上下文信息。
  • 中间件顺序不能乱:错误处理相关中间件必须放在路由、授权中间件之前,否则无法捕获所有请求的错误。
  • 直接返回StatusCode(code, message)时,消息不会自动传递到错误页面,需通过TempData或请求特性手动传递。

内容的提问来源于stack exchange,提问作者user896917

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:16:04