.net mvc actionresult 返回字符串_ASP.NET Core中的Action的返回值类型

在Asp.net Core之前所有的Action返回值都是ActionResult,Json(),File()等方法返回的都是ActionResult的子类。并且Core把MVC跟WebApi合并之后Action的返回值体系也有了很大的变化。

ActionResult类

ActionResult类是最常用的返回值类型。基本沿用了之前Asp.net MVC的那套东西,使用它大部分情况都没问题。比如用它来返回视图,返回json,返回文件等等。如果是异步则使用Task。

    public class TestController : Controller    {        public ActionResult Index()        {            return View();        }        public ActionResult MyFile()        {            return File(new byte[] { }, "image/jpg");        }        public ActionResult MyJson()        {            return Json(new { name = "json" });        }        public ActionResult Ok()        {            return Ok();        }    }

IActionResult接口

ActionResult类实现了IActionResult接口所以能用ActionResult的地方都可以使用IActionResult来替换。同样异步的话使用Task包起来做为返回值。

   public class ITestController : Controller    {        public IActionResult Index()        {            return View();        }        public IActionResult MyFile()        {            return File(new byte[] { }, "image/jpg");        }        public IActionResult MyJson()        {            return Json(new { name = "json" });        }        public IActionResult HttpOk()        {            return Ok();        }        public async Task AsyncCall()        {            await Task.Delay(1000);            return Content("ok");        }    }

直接返回POCO类

Asp.net Core的Controller的Action可以把POCO类型(其实不一定是POCO类,可以是任意类型,但是使用的时候一般都返回viwemodel等POCO类)当做返回值,不一定非要是ActionResult或者IActionResult。Asp.net Core框架会帮我们自动序列化返回给前端,默认使用json序列化。同样异步的话使用Task包起来做为返回值。

   public class Person    {        public string Name { get; set; }        public string Sex { get; set; }    }    public class ITestController : Controller    {          public Person GetPerson()        {            return new Person { Name = "abc", Sex = "f" };        }        public async Task> GetPersons()        {            await Task.Delay(1000);            return new List {            new Person { Name = "abc", Sex = "f" },            new Person { Name = "efg", Sex = "m" }            };        }    }

ActionResult< T >泛型类

当我们设计restful webapi系统的时候习惯使用POCO作为返回值。比如我们设计一个获取Person的api。通过 /person/001 url获取001号person。

    [Route("[controller]")]    public class PersonController : Controller    {        IPersonRepository _repository;        PersonController(IPersonRepository repository)         {            _repository = repository;        }        [HttpGet("{id}")]       public Person Get(string id)        {            return _repository.Get(id);        }    }

这个方法看起来好像没什么问题,但其实有个小问题。如果repository.Get方法没有根据id查找到数据,那么将会返回null。如果null做为Action的返回值,最后框架会转换为204的http status code。

d49ce61a3ffc816ea9f76a456077a08c.png

204表示No Content 。做为restful api,204的语义在这里会有问题,这里比较适合的status code是404 NOT FOUND 。那么我们来改一下:

        [HttpGet("{id}")]       public Person Get(string id)        {            var person = _repository.Get(id);            if (person == null)            {                Response.StatusCode = 404;            }            return person;        }

现在如果查找不到person数据,则系统会返回404 Not Found 。

d49ce61a3ffc816ea9f76a456077a08c.png

但是这看起来显然不够优雅,因为ControllerBase内置了NotFoundResult NotFound() 方法。这使用这个方法代码看起来更加清晰明了。继续改:

        [HttpGet("{id}")]       public Person Get(string id)        {            var person = _repository.Get(id);            if (person == null)            {                return NotFound();            }            return person;        }

很不幸,这段代码VS会提示错误。因为返回值类型不一致。方法签名的返回值是Person,但是方法内部一会返回NotFoundResult,一会返回Person。

81a9f328b406b3cb7bd583fa43f63133.png

解决这个问题就该ActionResult< T >出场了。我们继续改一下:

        [HttpGet("{id}")]       public ActionResult Get(string id)        {            var person = _repository.Get(id);            if (person == null)            {                return NotFound();            }            return person;        }

现在VS已经不会报错了,运行一下也可以正常工作。但仔细想想也很奇怪,为什么返回值类型改成了ActionResult< Person >就不报错了呢?明明返回值类型跟方法签名还是不一致啊?

深入ActionResult< T >

接上面的问题,让我们看一下ActionResult的内部:

270d69a635307cc2afccb64cb1333eae.png

看到这里就明白了原来ActionResult< T >里面内置了2个implicit operator方法。implicit operator用于声明隐式类型转换。

public static implicit operator ActionResult(ActionResult result); 

表示ActionResult类型可以转换为ActionResult< TValue >类型。

public static implicit operator ActionResult(TValue value)

表示TValue类型可以转换为ActionResult< TValue >类型。

因为有了这2个方法,当ActionResult或者TValue类型往ActionResult< T >赋值的时候会进行一次自动的类型转换。所以VS这里不会报错。

总结

  1. 大部分时候Action的返回值可以使用ActionResult/IActionResult
  2. 设计restful api的时候可以直接使用POCO类作为返回值
  3. 如果要设计既支持POCO类返回值或者ActionResult类为返回值的action可以使用ActionResult< T >作为返回值
  4. ActionResult< T >之所以能够支持两种类型的返回值类型,是因为使用了implicit operator内置了2个隐式转换的方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.jdeveloper_在JDeveloper 12.1.3中为WebSocket使用Java API

.jdeveloper介绍 最新版本的JDeveloper 12c&#xff08;12.1.3.0&#xff09;和WebLogic Server 12.1.3一起提供了一些新的Java EE 7功能。 其中之一是对用于WebSocket的JSR 356 Java API的支持。 实际上&#xff0c;从12.1.2.0版本开始就支持WebSocket协议&#xff08;RFC 645…

为什么程序员需要关心顺序一致性,而不是 Cache 一致性?

本文所讨论的计算机模型是Shared Memory Multiprocessor&#xff0c;即我们现在常见的共享内存的多核CPU。本文适合的对象是想用C 或者Java进行多线程编程的程序员。本文主要包括对Sequential Consistency和Cache Coherence的概念性介绍并给出了一些相关例子&#xff0c;目的是…

南科大计算机科学与技术专业如何,广州大学、深圳大学、汕头大学、南方科技大学,如何排名?...

广州大学、深圳大学、汕头大学和南方科技大学都是广东省内的一流大学。为了方便各位广东考生在填报志愿的时候有一个更好的了解&#xff0c;顺哥收集整理了这4所学校的一些信息。希望能帮助到大家。深圳大学2021年校友会排名省内第4&#xff0c;全国第57&#xff0c;中国一流大…

canoco5冗余分析步骤_打造高性能的大数据分析平台

大数据时代&#xff0c;大数据的应用与挖掘&#xff0c;大数据的分析和决策&#xff0c;大数据在经济社会的运行轨道上发挥着愈来愈重要的作用。对于大数据分析&#xff0c;现在好多互联网金融公司和传统的商业银行、证券基金公司都非常看重。个个都想在大数据分析中获得重要信…

C 迭代器iterator的实现原理

在经典的设计模式中&#xff0c;有一种迭代器模式&#xff0c;定义为&#xff1a;提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。迭代器的主要优点如下&#xff1a;访问一个聚合对象的内容而无须暴露它的内部表示。遍历任务交由迭代器…

html如何在画布上加层,在Canvas中嵌套Html

大概是这样的&#xff0c;现在需要根据一下上传的图片以及一些输入生成图片。本来打算用imagemagick的&#xff0c;但是后来觉得这样前后端要搞两份不同的代码&#xff0c;然后imagemagick使用起来远没有canvas用起来顺手啊。So&#xff0c;最终决定就用Canvas搞定它了&#xf…

如何用illustrator做技术手册_做期货用什么技术指标分析?

来源&#xff1a;期汇股金作者&#xff1a;DC链接&#xff1a;做期货用什么技术指标分析&#xff1f;投资期货市场首先我们要有一套自己的技术分析&#xff0c;那么我们有什么样的技术指标分析最准确呢&#xff0c;没有最准确的技术指标&#xff0c;要看你运用的程度&#xff0…

根据字符串自动构造对应类

问题的起因是&#xff0c;我在做一个demo&#xff0c;有一个对象基类&#xff0c;以及一堆派生出的子对象&#xff0c;比如球体、立方体之类的对象。还有一个对象管理类&#xff0c;用于存储场景中的所有对象。那么在初始化的时候&#xff0c;代码是这么写的&#xff1a;class …

openshift k8s_带有DIY的Openshift上的Spring Boot / Java 8 / Tomcat 8

openshift k8sDIY盒带是一种实验性盒带&#xff0c;提供了一种在OpenShift上测试不受支持的语言的方法。 它提供了最小限度的自由形式的支架&#xff0c;将墨盒的所有细节留给了应用程序开发人员 。 这篇博客文章说明了结合了PostgreSQL服务的Spring Boot / Java 8 / Tomcat 8应…

都兰县第一中学计算机,都兰县第一中学教案.doc

PAGE \* MERGEFORMATPAGE \* MERGEFORMAT 1都兰县第一中学教案班级初一.班周次9时间45分钟课时2授课教师席得勋教学内容篮球&#xff1a;胸前双手传接球器 材篮球25个、栏架4个、垫子4个、长凳4个、标志桶4个教学目标运动参与目标:通过学习激发学生兴趣&#xff0c;使学生积极参…

.sql文件如何执行_mysql:一条SQL查询语句是如何执行的?

本篇文章将通过一条 SQL 的执行过程来介绍 MySQL 的基础架构。首先有一个 user_info 表&#xff0c;表里有一个 id 字段&#xff0c;执行下面这条查询语句&#xff1a;select * from user_info where id 1;返回结果为&#xff1a;-------------------------------------------…

jooq和jdbc_在jOOQ之上构建的RESTful JDBC HTTP服务器

jooq和jdbcjOOQ生态系统和社区正在持续增长。 我们个人总是很高兴看到基于jOOQ构建的其他开源项目。 今天&#xff0c;我们非常高兴为您介绍BjrnHarrtell结合REST和RDBMS的一种非常有趣的方法。 BjrnHarrtell从小就是瑞典的程序员。 他通常在Sweco Position AB上忙于编写GIS系…

C 虚函数表及多态内部原理详解

C 中的虚函数的作用主要是实现了多态的机制。关于多态&#xff0c;简而言之就是用父类型别的指针指向其子类的实例&#xff0c;然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”&#xff0c;这是一种泛型技术。虚函数表每个含有虚函数的类都…

html代码编辑器sp,在线HTML编译,文本关键字高亮显示,富文本编辑实现大概思路...

????最近被安排做了一个HTML在线编译功能&#xff0c;也利用这个机会对HTML在线编译&#xff0c;关键字高亮&#xff0c;富文本编辑器等的实现做了一些比较表面的研究&#xff0c;做简要记录&#xff0c;以便再次遇到作为参考。????在线HTML编译????首先需要一个能…

numpy 平方_NumPy入门指南

本文介绍了NumPy的基础知识&#xff0c;NumPy是使用Python进行科学计算的软件包。我们将在此处介绍几类基本的数组操作&#xff1a; 创建NumPy数组 重塑数组 NumPy的数学运算 数组的索引和切片 遍历数组首先&#xff0c;让我们将NumPy导入为np。 这使我们可以使用快捷方式np来引…

android 揭示动画_揭示垃圾收集暂停的时间长度

android 揭示动画有几种方法可以改善您的产品。 一种这样的方法是仔细跟踪用户的体验并在此基础上进行改进。 我们确实自己应用了此技术&#xff0c;并再次花了一些时间查看不同的数据 除了我们追求的许多其他方面之外&#xff0c;我们还提出了一个问题“延迟GC触发应用程序的…

10 张程序员喜爱的壁纸,需要自取~

喜欢的话就请点个再看&#xff0c;分享到朋友圈吧~

iptables 开放远程_JavaWeb项目的部署以及远程调试

不点蓝字&#xff0c;我们哪来故事&#xff1f;Linux环境下软件的安装Linux环境下的程序的安装、更新、卸载和查看。rpm 命令&#xff1a;相当于windows程序的添加/卸载程序&#xff0c;进程程序的安装&#xff0c;查看&#xff0c;卸载。本地程序安装&#xff1a;rpm -ivh 程序…

计算机网络应用基础论文,计算机网络应用基础概述论文

如今计算机网络技术应用的范围比较普遍&#xff0c;已经渗透到了人们工作和生活的各个方面。计算机网络的应用代表着社会进入了一个全新的时代&#xff0c;是生产力发展到一定阶段的产物。下面是答.案.网 ZQNf.Com小编给大家推荐的计算机网络应用基础概述论文&#xff0c;希望大…

java 性能调优_Java性能调优调查结果(第一部分)

java 性能调优我们在2014年10月进行了Java性能调优调查。该调查的主要目的是收集对Java性能世界的见解&#xff0c;以改善Plumbr产品。 但是&#xff0c;我们也很高兴与您分享有趣的结果。 我们收集的数据为进行冗长的分析提供了素材&#xff0c;因此我们决定将结果划分为一系列…