ASP.NET MVC 控制器

简介: 上篇我们说到。编写控制器类的步骤可总结为两个:实现一个类,然后在该类中添加一些公有方法,在运行的该类的时候可作为控制器发现,而这些方法则作为操作被发现。

  上篇我们说到。编写控制器类的步骤可总结为两个:实现一个类,然后在该类中添加一些公有方法,在运行的该类的时候可作为控制器发现,而这些方法则作为操作被发现。

这里我们有两个细节:

1:系统如何知道实例化那个控制器

2:如何确定用那个方法。

  路由:

1:被传统的路由发现,2:通过特性路由发现,3:通过混合路由策略发现,

传统路由不做过多解释。特性路由,可以让URL模版与处理请求时使用的控制器和操作保持独立,以后,即使URL进行修改,也不需要重构代码。

混合路由则时前两者一起使用,不过注意的是,特性定义的路由比传统路由的优先级更高。

  POCO(plain Old C# Object)

控制器类可以是一个普通的传统C#对象。如果想被发现,要么类名带有Controller后缀,要么用Controller特性修饰该类。POCO简单来说,它能减少开销和/内存占用量。

 

  访问HTTP上下文

  POCO最大的问题是没有HTTP上下文,那么我们可以通过ActionContext来实现如:

publicclass PocoController {     [ActionController]     public ActionContext Context{get;set} ......   }

  操作筛选器

 1:它是围绕做方法运行的一段代码,可用于修改和扩展方法本身的行为。

1

2

3

4

5

publicinterfaceIActionFilter

{

   voidOnActionExecuting(ActionExecutingContext filterContext);

   voidOnActionExected(ActionExecutedContext filterContext);     

}

  它提供了挂钩,在操作之前和之后运行代码。在筛选器内能够访问请求和控制器上下文,并且可以读取和修改参数。

每个继承了Cobtroller类的,用户定义的控制器都会获得IActionFilter接口的默认实现。,事实上,基类Controller提供了一对可重写的方法,OnActionExecuting和OnActionExecuted。这就代表每个控制器类都有一个机会,用来决定在调用给定方法前,后或者调用方法前后做些什么,只需要重写基类的方法就能实现这种功能。当然POCO不具备.

image.png

image.png

计算执行了多少毫秒

2:筛选器的分类

:操作筛选器只是ASP.NET CORE 管道中调用的一种筛选器,按照筛选器实际完成的额任务,可分成不同的类型。

 

类型 描述
授权筛选器 管道中运行的第一个类筛选器,用来确定发出请求的用户是否有权发出当前的请求
资源筛选器 当授权之后,在管道的其余部分之前以及管道组件之后运行,对于缓存很有用
操作筛选器 在控制器方法操作之前和之后运行
异常筛选器 如果注册,则在发生未处理异常时触发
结果筛选器 在操作方法结果之前和之后运行

可以将筛选器应用单独方法,也可以应用到整个控制器类,影响该控制器公开的所有操作方法,相对的,在应用程序启动时注册了全局筛选器之后,他们将自动应用到任何控制器类的任何操作。

①:添加自定义头

publicclass HeaderAttribute:ActionFilterAttribute     {         publicstring Name { get; set; }         publicstring Value { get; set; }         publicoverridevoid OnActionExecuted(ActionExecutedContext context)         {            if(!string.IsNullOrWhiteSpace(Name)&&!string.IsNullOrWhiteSpace(Value))             {                 context.HttpContext.Response.Headers.Add(Name, Value);             }             return;         }              }

② 设置请求的区域性

[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple =false)]     publicclass CultureAttribute:ActionFilterAttribute     {         publicstring Name { get; set; }         publicstaticstring CookieName { get { return"_Culture"; } }         publicoverridevoid OnActionExecuting(ActionExecutingContext context)         {             var culture = Name;             if (string.IsNullOrWhiteSpace(culture))                 culture = GetSavedCultureOrDefault(context.HttpContext.Request);             SetCultureOnThread(culture);             base.OnActionExecuting(context);         }         private  staticvoid SetCultureOnThread(string language)         {             var cultureInfo = new CultureInfo(language);             CultureInfo.CurrentCulture = cultureInfo;             CultureInfo.CurrentUICulture = cultureInfo;         }         privatestaticstring GetSavedCultureOrDefault(HttpRequest request)         {             var culture = CultureInfo.CurrentCulture.Name;             var cookie = request.Cookies[CookieName] ?? culture;             return culture;         }     }

主要是在操作方法之前检查一个名为_Culture的自定义cookie,其中包含了用户首选的语言,如果没找到cookie,筛选器默认使用当前区域性,并赋值给当前的线程。最后全局注册

③:将方法限制只能Ajax调用

publicclass AjaxOnlyAttribute:ActionMethodSelectorAttribute     {         publicoverridebool IsValidForRequest(RouteContext routeContext, ActionDescriptor action) => routeContext.HttpContext.Request.IsAjaxRequest();     }

publicstaticclass HttpRequestExtensions     {         publicstaticbool IsAjaxRequest(this HttpRequest httpRequest)         {             if (httpRequest == null)                 thrownew ArgumentException("request");             if (httpRequest.Headers != null)                 return httpRequest.Headers["X-Requested-With"] == "XMLHttpRequest";             returnfalse;         }     }


相关文章
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
44 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
68 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
50 0
|
4月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
4月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
135 0
|
前端开发 数据安全/隐私保护
net MVC中的模型绑定、验证以及ModelState
net MVC中的模型绑定、验证以及ModelState 模型绑定 模型绑定应该很容易理解,就是传递过来的数据,创建对应的model并把数据赋予model的属性,这样model的字段就有值了。
1697 0
|
7月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
195 0
|
7月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
82 0
|
7月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
353 5
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
170 0