Controllers, Actions 和 Action Results

原文:Controllers, Actions, and Action Results
作者:Steve Smith
翻译:姚阿勇(Dr.Yao)
校对:许登洋(Seay)

Action 和 action result 是开发者使用 ASP.NET MVC 构建应用程序的基础部分。

 

什么是 Controller

在 ASP.NET MVC 中, 控制器( Controller
 )用于定义和聚合操作(Action)的一个集合。操作( 或操作方法 )是控制器中处理入站请求的一个方法。控制器提供了一种逻辑方式将相似的操作组织起来,允许一些通用的规则(如:路由,缓存和验证)得到共同的应用。 入站请求通过路由(routing)被映射到操作上。

在 ASP.NET Core MVC 中,控制器可以是任何以 “Controller” 结尾或者继承自以 “Controller” 结尾的可实例化类。控制器应当遵循 显式依赖原则 并且通过使用依赖注入在构造函数中获取他们需要的任何依赖项。

按照惯例,控制器类:

  • 放在根目录下的 “Controllers” 文件夹中
  • 继承自 Microsoft.AspNetCore.Mvc.Controller

这两个惯例不是强制要求。

在模型-视图-控制器模式中,控制器负责初始化请求以及实例化模型。通常来说,业务流程应当放在模型中执行。

说明
模型应该是一个简单的传统 CLR 对象(Plain Old CLR Object (POCO) ),而不是一个数据库上下文 DbContext 或者关系数据库类型。

控制器取得模型的执行结果(如果有),返回正确的视图以及相关的视图数据。更多请参考:Overview of ASP.NET Core MVC 和 ASP.NET Core MVC 和 Visual Studio 入门

技巧
控制器是一个 UI级别 的抽象。它的责任在于确保入站请求的数据是有效的,然后选择应当返回哪一个视图(或者 API 的结果)。在有着良好分解的应用程序中,控制器不会直接包含数据访问或业务逻辑,而是委托给服务去处理这些任务。

 

Action 的定义

控制器上的任意公共方法都是一个 Action 。Action 上的参数是通过 模型绑定 来请求数据绑定并校验。

提示
带有参数的 Action 方法应该检查 ModelState.IsValid 属性的值是否为真 。

Action 方法应当包含将传入请求映射到业务的逻辑。业务关注通常应该表现为由控制器通过( 依赖注入(dependency injection))访问服务。Actions 然后映射业务行为的结果到应用程序的状态。

Action 可以返回任何东西,但是常常会返回一个 IActionResult (或异步方法返回的 Task<IActionResult> )实例生成响应。Action 方法负责选择“响应的类型”,Action Result 负责“响应的执行”。

 

控制器辅助方法

  • 视图(View)
    返回一个使用模型渲染 HTML 的视图。例: return View(customer);
  • HTTP 状态代码
    返回一个 HTTP 状态代码。例: return BadRequest();
  • 格式化的响应
    返回 Json 或类似以特定方式格式化的对象。例: return Json(customer);
  • 内容协商的响应
    除了直接返回一个对象,Action 还可以返回一个内容协商的响应(使用 OkCreated,CreatedAtRoute 或 CreatedAtAction )。例如:return Ok();  或 return CreatedAtRoute("routename",values,newobject");
  • 重定向
    返回一个指向其他 Action 或目标的重定向(使用 Redirect,LocalRedirect,RedirectToAction 或 RedirectToRoute )。例如: return RedirectToAction("Complete", new {id = 123});

除了上面的方法之外,Action 还可以直接返回一个对象。在这种情况下,对象将以客户端要求的方式进行格式化。详情请参考: 格式化响应数据

 

横切关注点

在大多数应用中,许多 Action 会共用部分工作流。例如,大多数应用可能只对验证过的用户开放,或者要利用缓存。当你想要在 Action 方法运行之前或之后执行一些逻辑业务时,可以使用 过滤器(filter) 。利用 过滤器(filters) 处理一些横切关注点,可以防止你的 Action 变得过于臃肿。这有助于剔除 Action 中的重复代码,使得它们可以遵循 不要重复你自己(DRY)原则 。

就验证和授权而言,你可以将 Authorize 特性应用在任何一个要求授权的 Action 上。将它加在控制器上将会对该控制器里的所有的 Action 采用授权。这个特性的添加将确保每个访问此 Action 的请求都被应用了对应的过滤器。有些特性可以同时应用在控制器和 Action 上,以提供对过滤器行为更小粒度的控制。

关于 MVC 应用程序中横切关注点的其他例子:

提示
在 MVC 应用程序里,很多横切关注点都可以利用过滤器来处理。还有另一种对所有 ASP.NET Core 应用程序都有效的选择需要记住,就是自定义 中间件(middleware)

返回目录

由于水平有限,错漏之处在所难免,欢迎大家批评指正,不胜感激,我们将及时修正。
dotNet Core Studying Group:436035237
 
分类: ASP.NET CORE

Controllers, Actions 和 Action Results的更多相关文章

  1. ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results

    原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...

  2. Web API 2中的Action Results

    [译]Action Results in Web API 2 单击此处查看原文 本文阐述了ASP.NET Web API是如何将controller action的返回值转换为HTTP respons ...

  3. Action Results in Web API 2

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action- ...

  4. GitHub Actions in Action

    GitHub Actions in Action https://lab.github.com/githubtraining/github-actions:-hello-world https://g ...

  5. web api :Action Results in Web API 2

    原文:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/action-results Web api 返回 ...

  6. 【Web API系列教程】1.2 — Web API 2中的Action Results

    前言 本节的主题是ASP.NET Web API怎样将控制器动作的返回值转换成HTTP的响应消息. Web API控制器动作能够返回下列的不论什么值: 1. void 2. HttpResponseM ...

  7. Action Results in MVC

  8. ASP.NET MVC- Controllers and Routing- Controller Overview

    In this tutorial, Stephen Walther introduces you to ASP.NET MVC controllers. You learn how to create ...

  9. 第十五章 提升用户体验 之 设计实现MVC controllers 和 actions

    1. 概述 controllers 和 actions 是 ASP.NET MVC4中非常重要的组成部分. controller管理用户和程序间的交互,使用action作为完成任务的方式. 如果是包含 ...

随机推荐

  1. iOS开发之蓝牙通信

    一.引言 蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单.相关的蓝牙操作由专门的 CoreBluetooth.framework进行统一管理.通过蓝牙进 ...

  2. php连接oracle数据库(linux)(转)

    php连接访问Oracle是用过oci函数,以下是整理的文档 1.安装Apache和php包 yum install -y httpd php* 2.下载Oracle组件 oracle-instant ...

  3. java编译环境

    系统环境变量: path D:\Program Files\Java\jdk1.7.0_45\bin (若里面已经有内容,前面加一个分号) 在c盘当前目录,能编译d盘的文件吗----能 javac D ...

  4. 一个App带你学会Retrofit2.0,麻麻再也不用担心我的网络请求了!

    Retrofit.Retrofit.Retrofit,越来越多的人在玩这个网络请求框架,这个由squareup公司开源的网络请求框架确实挺好用,今天我们就来看一下这个东东怎么玩! Retrofit作为 ...

  5. Java基础知识强化之IO流笔记45:IO流练习之 把集合中的数据存储到文本文件案例

    1. 把集合中的数据存储到文本文件案例:    需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字 ...

  6. Ubuntu16.04/windows7修改本地hosts文件

    1. 从github上下载最新的hosts文件:https://serve.netsh.org/pub/ipv4-hosts/ ubuntu16.04: 第二步:Ctrl+Alt+T 打开ubuntu ...

  7. YII中面包屑制作(当前位置:网站首页 >> 会员登陆)

    面包屑制作(当前位置:网站首页 >> 会员登陆) 作用:就是在布局里要显示的信息,但这个信息在不同的页面里显示的内容不一样,例如:网页的title.网页的当前位置等等 1.布局中每个页面t ...

  8. MyFramework框架搭建(一)DAL层

    一直以来有一个想法,搭建一个属于自己的框架,将自己学到的东西整合到框架里,不断的完善,让它随着我的成长而成长,下面介绍我第一阶段的总结:DAL层搭建 一.基础配置 1.我用的是Ibatis.net框架 ...

  9. 关于Handler与异步消息处理循环的摘抄

    Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue 统一队列,终由Handler处理. Handler:处理者,负责Message的发送及处理.使用Ha ...

  10. Using Run-Time Dynamic Linking(使用运行时动态链接库)

    // A simple program that uses LoadLibrary and // GetProcAddress to access myPuts from Myputs.dll. #i ...