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

如何让.NET Core + Entity Framework项目的错误页面更友好并匹配站点风格

适配站点风格的自定义错误页面实现方案

方案1:全局异常中间件统一处理(最推荐,全站点生效)

该方案可以统一处理所有请求的异常和404/403等状态码,一次配置全站点生效,错误页自动复用站点全局样式。

  1. 配置异常处理中间件
    .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方法中即可,逻辑完全一致。

  1. 新增错误处理控制器
public class ErrorController : Controller
{
    [Route("Error/{statusCode?}")]
    public IActionResult Index(int? statusCode)
    {
        // 可根据不同状态码返回不同提示
        ViewBag.ErrorMsg = statusCode switch
        {
            404 => "你访问的页面/资源不存在",
            403 => "你没有权限访问该内容",
            _ => "服务器处理请求时发生错误,请稍后重试"
        };
        return View();
    }
}
  1. 新增错误页视图
    在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:06:05