.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
相关产品推荐
相关产品推荐

