使用MVC框架中要注意的问题(八):HandleError

本文介绍ASP.NET MVC中使用HandleErrorAttribute特性的方法,通过设置属性实现自定义错误页面及异常处理逻辑。包括ExceptionType、View等配置项,并提供自定义错误处理的Web.config配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了 HandleErrorAttribute特性,那么默认的,当这个Action抛出了异常时MVC将会显示Error视图,该视图位于~/Views /Shared目录下.

设置HandleError属性

可以通过设置下面这些属性来更改HandleErrorAttribute特性的默认处理:

  • ExceptionType.指定过滤器处理那种或哪些类型的异常,如果没有指定该属性,过滤器将会处理所有的异常.
  • View.指定发生异常时过滤器要显示的视图名称.
  • Master.指定视图母版的名称,如果有的话.
  • Order.指定过滤器应用的顺序,如果一个Action有多个HandleErrorAttribute过滤器.

指定Order属性

如果某个Action设置了多个HandleErrorAttribute,Order属性可以用来确定使用哪个过滤器.其值可以设置为从-1(最高优先级)到任何正整数之间的整数来标识其优先级,值越大,优先级别越低.Order属性遵循以下规则:

  1. 应用到Controller上的过滤器将会自动应用到该Controller的所有Action上.
  2. 如果Controller和Action都应用了HandleErrorAttribute,那么只要Order属性值相同,将会先执行Controller上的过滤器,而后才会执行Action上的过滤器.
  3. 对于相同Order属性的过滤器,其执行先后次序不定.
  4. 如果没有指定Order属性,则默认为-1,这意味着该过滤器将比其他的过滤器优先执行,除非其他过滤器指定了Order为-1.
  5. 如果有多个过滤器可适用,那么第一个可以处理该异常的过滤器会被首先调用,然后针对该异常的处理将会终结.

在View中获取异常信息

ASP.NET MVC框架将异常信息存储在ViewDataDictionary中来传递给Error视图,该ViewDataDictionary的Model属性即是ExceptionContext类的一个实例,这个ViewData有下面几个键:

ActionName:目标Action方法的名称
ControllerName:目标Controller的名称
Exception:异常对象.

启用自定义错误处理

下面我们来开启用于HandleErrorAttribute过滤器的自定义错误处理,打开程序的Web.config文件,在system.web节中加入一个customErrors元素,如下所示



<think>我们正在回答用户关于.NET MVC Core框架的概述和使用问题。根据用户的要求,我们需要使用中文回答,并遵循LaTeX格式要求。同时,我们需要在回答中引用提供的参考内容(尽管这些引用内容主要是关于ASP.NET MVC的,但我们可以从中提取一些通用概念,并注意区分Core版本)。 首先,我们注意到用户提供的引用内容主要是关于传统ASP.NET MVC的,而用户询问的是.NET Core MVC(现在称为ASP.NET Core MVC)。因此,我们需要将重点放在ASP.NET Core MVC上,但可以借鉴一些MVC模式的基本概念。 ASP.NET Core MVC是一个用于构建Web应用程序和API的框架,它采用模型-视图-控制器(MVC)架构模式。与传统的ASP.NET MVC相比,ASP.NET Core MVC是跨平台的,并且具有更高的性能和更灵活的设计。 根据引用[1],在传统ASP.NET MVC中,控制器必须实现IController接口,并且类名以"Controller"结尾。在ASP.NET Core MVC中,控制器通常继承自Controller基类(它本身实现了必要的接口),但也可以创建POCO(Plain Old CLR Object)控制器,不过约定仍然是以"Controller"结尾。 引用[2]展示了在视图中使用Razor语法遍历ViewBag中的列表。在ASP.NET Core MVC中,视图通常使用Razor语法,并且推荐使用强类型视图(通过视图模型)而不是ViewBag。 引用[3]提到了异步操作中的线程问题。在ASP.NET Core中,异步编程得到了更好的支持,而且由于新的架构(如中间件管道和依赖注入),处理异步操作更加简洁。 引用[4]讨论了过滤器属性(Filter Attributes)的命名。在ASP.NET Core MVC中,过滤器仍然是重要的特性,它们可以应用于控制器或操作方法,用于处理横切关注点(如异常处理、授权等)。 现在,我们组织回答: 1. 概述:介绍ASP.NET Core MVC框架及其优势。 2. 核心组件:分别介绍模型(Model)、视图(View)、控制器(Controller)的作用。 3. 基本使用:创建一个简单的控制器和视图。 4. 其他特性:路由、中间件、依赖注入等(在Core中这些是基础)。 5.ASP.NET MVC的区别:简要说明。 由于引用内容有限,我们主要依靠自己的知识,并在适当的地方引用。 注意:用户要求生成相关问题,我们将在回答结束后生成。 回答如下:</think>### ASP.NET Core MVC 框架概述与使用 ASP.NET Core MVC 是微软推出的跨平台、高性能 Web 应用开发框架,基于模型-视图-控制器(MVC)模式。相较于传统 ASP.NET MVC,它具备轻量级、模块化、开源等优势,支持 Docker 容器化部署和云原生应用开发[^1]。 #### 一、核心组件 1. **控制器 (Controller)** - 处理用户请求,协调模型与视图交互。 - 类名需以 `Controller` 结尾(如 `HomeController`),并继承 `Controller` 基类[^1]。 - 示例: ```csharp public class ProductController : Controller { public IActionResult Index() { return View(); // 返回视图 } } ``` 2. **视图 (View)** - 使用 Razor 语法渲染 UI,支持强类型模型绑定。 - 通过 `ViewBag` 或 `ViewData` 传递数据(推荐使用强类型视图模型)[^2]。 - 示例(Razor 视图): ```html @foreach (var product in Model.Products) { <div>@product.Name - ¥@product.Price</div> } ``` 3. **模型 (Model)** - 封装业务逻辑和数据,如实体类或服务层: ```csharp public class Product { public int Id { get; set; } public string Name { get; set; } } ``` #### 二、关键特性 1. **路由配置** - 约定路由:`Startup.cs` 中配置默认模式: ```csharp app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); ``` - 属性路由:直接在控制器方法上定义: ```csharp [HttpGet("products/{id}")] public IActionResult Details(int id) { ... } ``` 2. **依赖注入 (DI)** - 内置 IOC 容器,注册服务: ```csharp public void ConfigureServices(IServiceCollection services) { services.AddScoped<IProductService, ProductService>(); } ``` - 控制器中注入: ```csharp public ProductController(IProductService service) { _service = service; // 自动解析依赖 } ``` 3. **过滤器 (Filters)** - 处理横切关注点(如授权、异常): ```csharp [Authorize] // 授权过滤器 public class AdminController : Controller { ... } [HandleError] // 异常过滤器[^4] public IActionResult ErrorProneMethod() { ... } ``` 4. **异步编程** - 使用 `async/await` 避免阻塞线程: ```csharp public async Task<IActionResult> GetData() { var data = await _service.FetchAsync(); return View(data); } ``` - 注意线程上下文问题(如 `HttpContext` 访问需同步)[^3]。 #### 三、工作流程 1. 用户发起请求 → 路由匹配控制器方法 → 控制器调用模型处理数据。 2. 控制器选择视图 → 视图引擎渲染 HTML → 响应返回客户端。 #### 四、优势场景 - 构建 RESTful API 或动态 Web 应用。 - 需精细控制 HTML 的前后端分离场景。 - 跨平台部署(Linux/macOS/Windows)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值