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

ASP.NET Core 7 MVC:为异常处理页扩展控制器友好显示名称

ASP.NET Core 7 MVC 异常处理页面获取控制器友好名称方案

实现步骤

1. 为控制器添加DisplayName属性

直接在目标控制器上标注.NET自带的DisplayNameAttribute,设置业务友好名称:

[DisplayName("Corporate Privacy Compliance Page")]
public class PrivacyController : Controller
{
    public IActionResult Index()
    {
        // 业务逻辑,此处模拟异常
        throw new InvalidOperationException("业务处理失败");
        return View();
    }
}

2. 编写HttpContext扩展方法获取友好名称

创建扩展方法,通过路由数据定位控制器类型,读取DisplayName属性值,同时加入缓存避免重复反射:

using System.Reflection;
using System.ComponentModel;

public static class HttpContextExtensions
{
    // 缓存控制器类型映射,提升性能
    private static readonly Dictionary<string, Type> _controllerTypeCache = new();

    static HttpContextExtensions()
    {
        // 程序启动时加载所有控制器类型到缓存
        var controllerTypes = Assembly.GetExecutingAssembly()
            .GetTypes()
            .Where(t => t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase));
        
        foreach (var type in controllerTypes)
        {
            var controllerName = type.Name.Replace("Controller", "", StringComparison.OrdinalIgnoreCase);
            _controllerTypeCache[controllerName] = type;
        }
    }

    public static string GetControllerFriendlyName(this HttpContext context)
    {
        var controllerName = context.Request.RouteValues["controller"]?.ToString();
        if (string.IsNullOrEmpty(controllerName))
            return "未知页面";

        if (!_controllerTypeCache.TryGetValue(controllerName, out var controllerType))
            return controllerName;

        var displayNameAttr = controllerType.GetCustomAttribute<DisplayNameAttribute>();
        return displayNameAttr?.DisplayName ?? controllerName;
    }
}

3. 在异常处理控制器中使用友好名称

在自定义错误页面控制器里,通过扩展方法获取友好名称,生成动态错误提示:

public class ErrorController : Controller
{
    [Route("/Error")]
    public IActionResult Index()
    {
        var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
        var friendlyPageName = HttpContext.GetControllerFriendlyName();

        ViewBag.ErrorMessage = $"An error occurred with the {friendlyPageName}";
        return View();
    }
}

4. 配置异常处理中间件

确保在Program.cs中正确配置异常处理中间件,指向自定义错误页面:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

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

app.Run();

扩展说明

  • 如果需要支持Action级别的友好名称,可以修改扩展方法,从路由数据中获取action名称,再读取对应Action方法的DisplayNameAttribute属性
  • 缓存控制器类型的逻辑避免了每次异常时重复执行反射操作,有效提升性能

内容的提问来源于stack exchange,提问作者Rob K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:41:17