如何让.NET Core + Entity Framework项目的错误页面更友好并匹配站点风格
适配站点风格的自定义错误页面实现方案
方案1:全局异常中间件统一处理(最推荐,全站点生效)
该方案可以统一处理所有请求的异常和404/403等状态码,一次配置全站点生效,错误页自动复用站点全局样式。
- 配置异常处理中间件
.NET 6+版本在Program.cs中添加如下配置,注意异常处理中间件要放在所有请求处理中间件的最前面:
var builder = WebApplication.CreateBuilder(args); // 原有服务注册逻辑保留 var app = builder.Build(); // 仅生产环境启用自定义错误页,开发环境保留开发者异常页方便调试 if (!app.Environment.IsDevelopment()) { // 处理500类服务异常 app.UseExceptionHandler("/Error"); // 处理404/403等状态码错误 app.UseStatusCodePagesWithReExecute("/Error/{0}"); } else { app.UseDeveloperExceptionPage(); } // 原有静态文件、路由、授权等中间件配置保留
.NET Core 3.1及更早版本将上述中间件配置放到Startup.cs的Configure方法中即可,逻辑完全一致。
- 新增错误处理控制器
public class ErrorController : Controller { [Route("Error/{statusCode?}")] public IActionResult Index(int? statusCode) { // 可根据不同状态码返回不同提示 ViewBag.ErrorMsg = statusCode switch { 404 => "你访问的页面/资源不存在", 403 => "你没有权限访问该内容", _ => "服务器处理请求时发生错误,请稍后重试" }; return View(); } }
- 新增错误页视图
在Views/Error文件夹下新建Index.cshtml,直接复用站点全局布局即可自动匹配其他页面风格:
@{ ViewData["Title"] = "错误提示"; // 直接引用站点全局共用的布局页,自动继承所有样式、头部尾部 Layout = "_Layout"; } <div class="container mt-5"> <div class="alert alert-danger"> <h4>操作失败</h4> <p>@ViewBag.ErrorMsg</p> <a href="@Url.Action("Index", "Home")" class="btn btn-primary">返回首页</a> </div> </div>
方案2:局部异常捕获(仅针对特定接口/页面生效)
如果只需要给你提供的Edit这类特定操作自定义错误返回,可直接在控制器中捕获异常后返回自定义视图,修改你的代码如下:
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, [Bind("Id,EngineName,FactoryName")] ProductionRound productionRound) { if (ModelState.IsValid) { try { _context.Update(productionRound); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!ProductionRoundExists(productionRound.Id)) { ViewBag.ErrorMsg = "当前编辑的生产记录不存在,可能已被删除"; // 返回自定义错误视图,复用全局布局 return View("CustomError"); } else { ViewBag.ErrorMsg = "当前记录已被其他用户修改,请刷新后重试"; return View("CustomError"); } } catch (Exception) { ViewBag.ErrorMsg = "保存数据时发生错误,请稍后重试"; return View("CustomError"); } return RedirectToAction(nameof(Index)); } return View(productionRound); }
这里的CustomError视图和方案1的错误页逻辑一致,引用全局布局即可匹配站点风格。
注意事项
- 开发环境不要开启自定义错误页,避免遮挡异常栈信息影响调试
- 生产环境的错误提示不要输出异常详情、数据库报错等敏感信息,避免泄露服务器配置
- 确保全局布局依赖的CSS、JS等静态资源不需要登录权限即可访问,避免错误页加载样式失败
内容的提问来源于stack exchange,提问作者SkyeBoniwell
相关产品推荐
相关产品推荐

