MVC 中的 Controller






4.67/5 (7投票s)
控制器是 MVC 应用程序中最重要的组件之一,因为它充当视图和模型之间的协调器,并处理用户的请求。用户的请求由控制器接收。POST 控制器在 MVC 中首先出现在 codecompiled.com。
控制器是 MVC 应用程序中最重要的组件之一,因为它充当视图和模型之间的协调器,并且还处理用户的请求。用户的请求由控制器接收,控制器根据请求要求模型执行不同的 CRUD 操作,然后决定要返回给用户的结果。
在 Web Forms 的情况下,URL 和服务器硬盘上的文件之间存在直接关系,因为用户请求的文件就是 URL 的一部分。
在 MVC 中,请求的 URL 和用于处理请求的控制器类之间存在解耦的关系。客户端只需使用 URL 发出请求,MVC 应用程序负责将请求传递给将处理该请求的相应组件或控制器。
这种解耦使得更改 URL 结构变得容易,因为用户不知道实际处理请求的文件。这也有利于封装,因为应用程序的内部细节不会暴露给外部世界。
URL 和将处理请求的控制器类之间的映射是由URLRouting 模块(一个 HTTP 模块)负责的。
WebForms 页面在浏览器请求时执行。
MVC 中的路由模块将控制器与请求解耦。
请求从 URLRoutingModule 传递到控制器,控制器包含实际处理请求的动作方法。一旦请求到达控制器,它就会决定要执行操作的模型,然后决定需要返回给客户端的结果。
通常,我们的应用程序提供的每个主要功能都有一个控制器类。
因此,控制器是我们编写处理请求代码的地方。以下是控制器的一些重要特性。
1.控制器类和接口 框架要求所有控制器类都继承自 IController 接口。IController 接口指定了一个名为 Execute() 的单一方法,该方法接收一个 RequestContext 对象。
MVC 通过提供一个名为 Controller 的基类来简化控制器实现,该类实现了 IController 接口。因此,我们可以继承 Controller 类,而不是编写实现 IController 接口所需的所有样板代码。ControllerBase 是 Controller 类的父类,并实现了基本的控制器功能。ControllerBase 还实现了 IController 的 Execute() 方法。
我们的控制器类派生自基类 Controller。
我们派生 包含应用程序逻辑的控制器类,该类派生自 Controller 类,而 Controller 类又派生自 ControllerBase 类。Controller 类和 ControllerBase 类都实现了我们的控制器类所需的功能。
ControllerBase 实现 MVC 中所有控制器都必须实现的 IController 接口。它还定义了一些重要的属性,我们可以在动作方法中访问,例如
- ViewData 使用字典对象将数据传递给视图。
- ViewBag 使用动态属性将数据传递给视图。
- TempData 在控制器之间传递数据。
Controller 类继承了来自ControllerBase 类 的上述属性,并提供了其自身的有用属性,例如
属性 | 用途 |
---|---|
请求 | 引用当前的 HTTP 请求。 |
响应 | 引用当前的 HTTP 响应。 |
服务器 | 包含处理请求的有用方法。 |
Session | 引用当前会话。 |
ActionInvoker | 引用控制器的 ActionInvoker。 |
2. 动作方法 我们通过继承 Controller 类定义的控制器类期望我们在不同的动作方法中定义应用程序逻辑。每个动作方法都对应一个 URL,并在客户端请求该 URL 时被调用。
不同的 URL 由控制器类的不同动作方法处理。
要执行的动作方法由 MVC 的 ActionInvoker 组件选择。它实现了 IActionInvoker 接口。 框架提供的默认 ActionInvoker 通过动作方法名称选择动作方法。
3. 用于实现横切关注点的过滤器 横切关注点是指将在应用程序许多不同部分使用的功能。如果我们以日志记录为例,应用程序的不同部分可能需要访问日志记录功能。为了清晰地实现横切关注点,我们必须重用公共功能,而不是在不同的地方重新定义相同的功能。
横切关注点在 MVC 中通过使用过滤器属性来实现。而不是在不同的控制器和动作方法中复制公共功能,过滤器定义了公共功能。因此,我们可以通过用属性修饰动作方法和控制器来轻松应用横切关注点。这些属性反过来调用属性类。
常用的过滤器属性有
Filter | 用途 |
身份验证 | 这指定了身份验证逻辑。只有经过身份验证的用户才允许访问动作方法。 |
Authorization | 这指定了授权逻辑。只有经过授权的用户才允许访问动作方法。 |
操作 | 在动作方法执行之前和之后执行。 |
结果 | 在 ActionResult 执行之前和之后执行。 |
异常 | 当动作引发未处理的异常时执行。 |
4. 动作方法返回 ActionResult 动作方法不直接返回结果给用户,而是返回 ActionResult,它指定要返回给用户的结果。动作方法返回的ActionResult是派生自 ActionResult 类的类的对象。这是一个命令模式的例子,它封装了操作,以便可以将其传递给应用程序中的其他方法。这使得处理执行动作的对象的责任与想要执行动作的对象分离开来。因此,动作方法的责任仅仅是返回 ActionResult,它将在请求管道的后续阶段执行。
由于 ActionResult 是一个抽象类,框架提供了不同的 ActionResult 派生类来从动作方法返回不同类型的结果。有不同的 ActionResult 类型,如 ViewResult、RedirectResult、JsonResult。
动作方法可以直接创建并返回 ActionResult 实例,如下所示:
public ActionResult Create() { ViewResult result = new ViewResult(); return result; }
但与直接在动作方法中创建 ViewResult 实例不同,我们可以使用我们的控制器类所继承的Controller 类提供的辅助方法。因此,要返回 ViewResult,我们可以使用辅助方法,如下所示:
public ActionResult Create() { return View(); }
以下是一些 ActionResult 以及用于生成 ActionResult 的相应辅助方法:
ActionResult 类型 | 用途 | 辅助方法 |
ViewResult | 渲染视图。 | View() |
PartialViewResult | 渲染部分视图,部分视图是另一个视图的一部分。 | PartialView() |
RedirectResult | 重定向到另一个动作方法。 | Redirect() |
ContentResult | 返回指定的 MIME 类型。 | Content() |
JsonResult | 返回一个 JSON 对象。 | Json() |
因此,正如我们所见,MVC 中的控制器负责处理应用程序逻辑。我们可以使用框架提供的控制器类,或者如果我们想要更细粒度的控制,我们可以通过直接实现 IController 接口来创建并插入一个新的控制器类。