在上下文中使用的控制器
问题 | 答案 |
什么是控制器? | 控制器包含用于接收请求、更新应用程序状态或模型以及选择将发送给客户端的响应的逻辑 |
控制器有什么用? | 控制器是MVC项目的核心,并包含Web应用程序的逻辑 |
如何使用控制器? | 控制器是调用公共方法来处理HTTP请求的C#类。这些方法可以负责直接为客户生成响应但更常见的方式是返回操作结果,告诉MVC应该如何去响应 |
使用控制器是否有一些隐患或局限性? | 刚开始使用MVC时,可以轻松创建包含更适合于模型或视图功能的控制器。一个更为具体的问题是任何以Controller为名的公共类都会被假定为MVC的控制器,这意味着一些可能不是作为控制器的类被意外用于处理HTTP请求 |
是否有其他的替代选择? | 没有,控制器是MVC应用程序的核心部分 |
控制器的定义
控制器的定义:名称以Controller结尾的任何公共类都是控制器
public class PocoController { public string Index() => "This is a POCO Controller"; } |
PocoController满足了MVC控制器的基础标准,POCO表示“普通的CLR对象”,并指的是使用标准的.Net功能实现控制器,而不是直接依赖于ASP.Net Core MVC 提供的API
使用控制器基类
public class DerivedController : Controller { public IActionResult Index() { return View("Result",$"这是Derived控制器"); } } |
Controller基类主要优点是可以方便地访问当前请求。
用于上下文数据一些有用的控制器类属性
属性 | 描述 |
Request | 返回一个HttpRequest对象,用于描述从客户端收到的请求 |
Response | 返回用于创建客户端响应的HttpResponse 对象 |
HttpContext | 返回一个HttpContext对象,它是由其他属性(如请求和响应)返回的许多对象的源,它还提供了有关可用的HTTP功能的信息以及对低级功能(如Web套接字)的访问 |
RouteData | 返回由路由系统在匹配请求时生成的RouteData对象 |
ModelState | 返回一个ModelStateDictionary对象,用于验证客户端发送的数据 |
User | 返回一个ClaimsPrincipal对象,用于描述已发出请求的用户 |
使用Controller.Request属性会返回一个HttpRequest对象,以下描述了编写控制器时有用的HttpRequest属性
有用的HttpRequest
属性 | 描述 |
Path | 返回请求URL的路径部分 |
QueryString | 返回请求URL的查询字符串部分 |
Headers | 返回按名称索引的请求标题的字典 |
Body | 返回可用于读取请求正文的流 |
Form | 返回请求中表单数据的字典(按名称索引) |
Cookies | 返回按名称索引的请求cookie的字典 |
在POPC控制器里自定义视图
public class PocoController { [ControllerContext] public ControllerContext ControllerContext { get; set; } public ViewResult Headers() { var viewResult = new ViewResult() { ViewName = "DictonaryResult", ViewData = new Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary( new EmptyModelMetadataProvider(), new ModelStateDictionary()) { Model = ControllerContext.HttpContext. Request.Headers.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.First()) } }; return viewResult; } } |