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

