65.9K
CodeProject 正在变化。 阅读更多。
Home

MVC 中的 Controller

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (7投票s)

2014年12月31日

CPOL

6分钟阅读

viewsIcon

20437

控制器是 MVC 应用程序中最重要的组件之一,因为它充当视图和模型之间的协调器,并处理用户的请求。用户的请求由控制器接收。POST 控制器在 MVC 中首先出现在 codecompiled.com。

控制器是 MVC 应用程序中最重要的组件之一,因为它充当视图和模型之间的协调器,并且还处理用户的请求。用户的请求由控制器接收,控制器根据请求要求模型执行不同的 CRUD 操作,然后决定要返回给用户的结果。

在 Web Forms 的情况下,URL 和服务器硬盘上的文件之间存在直接关系,因为用户请求的文件就是 URL 的一部分。

在 MVC 中,请求的 URL 和用于处理请求的控制器类之间存在解耦的关系。客户端只需使用 URL 发出请求,MVC 应用程序负责将请求传递给将处理该请求的相应组件或控制器。

这种解耦使得更改 URL 结构变得容易,因为用户不知道实际处理请求的文件。这也有利于封装,因为应用程序的内部细节不会暴露给外部世界。

URL 和将处理请求的控制器类之间的映射是由URLRouting 模块(一个 HTTP 模块)负责的。

controller in mvc

WebForms 页面在浏览器请求时执行。

controller in mvc

MVC 中的路由模块将控制器与请求解耦。

请求从 URLRoutingModule 传递到控制器,控制器包含实际处理请求的动作方法。一旦请求到达控制器,它就会决定要执行操作的模型,然后决定需要返回给客户端的结果。

通常,我们的应用程序提供的每个主要功能都有一个控制器类。

因此,控制器是我们编写处理请求代码的地方。以下是控制器的一些重要特性。

1.控制器类和接口 框架要求所有控制器类都继承自 IController 接口。IController 接口指定了一个名为 Execute() 的单一方法,该方法接收一个 RequestContext 对象。

MVC 通过提供一个名为 Controller 的基类来简化控制器实现,该类实现了 IController 接口。因此,我们可以继承 Controller 类,而不是编写实现 IController 接口所需的所有样板代码。ControllerBase 是 Controller 类的父类,并实现了基本的控制器功能。ControllerBase 还实现了 IController 的 Execute() 方法。

controller in mvc

我们的控制器类派生自基类 Controller。

我们派生 包含应用程序逻辑的控制器类,该类派生自 Controller 类,而 Controller 类又派生自 ControllerBase 类。Controller 类和 ControllerBase 类都实现了我们的控制器类所需的功能。

ControllerBase 实现 MVC 中所有控制器都必须实现的 IController 接口。它还定义了一些重要的属性,我们可以在动作方法中访问,例如

  • ViewData 使用字典对象将数据传递给视图。
  • ViewBag 使用动态属性将数据传递给视图。
  • TempData 在控制器之间传递数据。

Controller 类继承了来自ControllerBase 类 的上述属性,并提供了其自身的有用属性,例如

属性 用途
请求 引用当前的 HTTP 请求。
响应 引用当前的 HTTP 响应。
服务器 包含处理请求的有用方法。
Session 引用当前会话。
ActionInvoker 引用控制器的 ActionInvoker。

2. 动作方法 我们通过继承 Controller 类定义的控制器类期望我们在不同的动作方法中定义应用程序逻辑。每个动作方法都对应一个 URL,并在客户端请求该 URL 时被调用。

controller to route mapping

不同的 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 接口来创建并插入一个新的控制器类。

POST MVC 中的控制器 最先出现在 codecompiled.com。

© . All rights reserved.