手机版

详细说明ASP.NET芯MVC中空心返回值的处理方法

时间:2021-08-29 来源:互联网 编辑:宝哥软件园 浏览:

前言

如果你是一个初学者,在ASP.NET或ASP.NET开始学习MVC,你可能不知道是什么。net框架和。净矿石是。别担心!我建议你看看https://docs.microsoft.com/zh-cn/aspnet/index,的官方文件,你可以很容易地看到比较和区别。

那个。NET Core MVC在如何返回操作结果方面非常灵活。

可以返回一个实现IActionResult接口的对象,如viewresult、fileresult、contentresult等。

[HttpGet]public IActionResult SayGood(){返回内容(' Good!');}当然也可以直接返回一个类的实例。

[HttpGet]公共字符串HelloWorld(){返回“Hello World”;} in。NET Core 2.1,还可以返回ActionResult的泛型对象。

[HttpGet]public actionresultienumerablesting Get(){返回新字符串[] { 'value1 ',' value 2 ' };}在今天的博客中,我们将看看如何。NET Core Mvc返回一个空对象以及如何更改的默认行为。空对象结果的. NET Core Mvc。

下面就不多说了,我们来看看详细的介绍

的默认处理行为。空对象的. NET核心Mvc

那么,当我们在Action中返回null时,结果是什么呢?

接下来,我们创建一个新的ASP.NET核心网络应用编程接口项目,并添加一个BookController,其代码如下:

[Route(' API/[controller]')][API controller]公共类Book controller : controller base { private readonly ListBook _ books=new ListBook { new Book(1,' CLR via C# '),new Book(2 ')。NET核心编程')};[HttpGet(' { id } ')]public IActionResult GetById(int id){ var item=_ books。first ordefault(p=p . BookId==id);返回Ok(项目);}//[HttpGet(' { id } ')]//public ActionResultBook GetById(int id)/{//var book=_ books。first ordefault(p=p . BookId==id);//还书;//}//[HttpGet(' { id } ')]//public Book GetById(int id)/{//var Book=_ books。first ordefault(p=p . BookId==id);//还书;//} }公共类Book{ public Book(int bookId,string bookName){ bookId=bookId;BookName=bookName} public int BookId { get设置;}公共字符串BookName { get设置;}}在这个Controller中,我们定义了一个书籍集合,并提供了三种根据书籍ID查询书籍的方法。

然后我们启动项目,使用Postman,并请求/api/book/3。结果如下:

你会发现返回的状态是204 NoContent,而不是我们想象的200 OK。可以修改前面代码的注释,使用另外两种方法,结果是一样的。

您可以尝试创建一个普通的ASP.NET MVC项目并添加类似的代码。结果如下

返回的结果是200 OK,内容为空

为什么会有结果?

不同于前人(ASP.NET的MVC和ASP的WebAPI)。NET),ASP.NET核心MVC非常巧妙地处理了空值。在上面的例子中,ASP.NET核心MVC将选择一个合适的输出格式化程序来输出响应内容。通常,这个输出格式化程序将是一个JSON格式化程序或一个XML格式化程序。

然而,对于空值,ASP.NET核心MVC使用一个特殊的格式化程序,HttpNoContentOutputFormatter,它将空值转换为状态代码204。这意味着空值不会被序列化为JSON或XML,这可能不是预期的结果。有时我们想返回200 OK,响应内容为空。

Tips:当Action的返回值为void或Task时,默认情况下,ASP.NET核心MVC也会使用HttpNoContentOutputFormatter

通过修改配置删除默认的空值格式化程序

我们可以将httpcontentoutputformatter对象的TreatNullValueAsNoContent属性设置为false,并通过默认的httpcontentoutputformatter移除null值的格式。

在Startup.cs文件的ConfigureService方法中,我们修改了添加了Mvc服务的默认输出格式化程序。代码如下

public void ConfigureServices(IServiceCollection services){ services .AddMvc(o={ o . OutPutformatters。移除类型(类型为(httpontenttoutpformatter));o.OutputFormatters.Insert(0,新的httpnocontenttoutpformatter { TreatNullValueAsNoContent=false;});});}修改之后我们重新运行程序,并使用邮递员访问/api/book/3

结果如下,返回值200好的,内容为null,这说明我们的修改成功了。

使用404未找到代替204无内容

在上面的例子中,我们禁用了204无内容行为,响应结果变为了200好的,内容为零。但是有时候,我们期望当找不到任何结果时,返回404未找到,那么这时候我们应该修改代码,进行扩展呢?

在. NET核心手动音量调节中我们可以使用自定义过滤器(自定义过滤器),来改变这一行为。

这里我们创建2个特性类NotFoundActionFilterAttribute和NotFoundResultFilterAttribute,代码如下:

公共类NotFoundActionFilterAttribute : ActionFilterAttribute { public override void onationexecuted(ActionExecutedContext)上下文){ if (context .结果是对象结果对象结果对象结果值==空){ 0上下文result=new NotFoundResult();} } }公共类NotFoundResultFilterAttribute : ResultFilterAttribute { public override void on result executing(result executing context){ if(context .结果是对象结果对象结果对象结果值==空){ 0上下文result=new NotFoundResult();} }}代码解释

这里使用了滤器和结果过滤器属性,动作过滤器属性中的已执行方法会在行为执行完后触发,ResultFilterAttribute的OnResultExecuting会在行为返回结果前触发。这2个方法都是针对行为的返回结果进行了替换操作,如果返回结果的值是null,就将其替换成NotFoundResult添加完成后,你可以任选一个类,将他们添加在

控制器头部

[路由(' API/[控制器]')][API控制器][NotFoundResultFilter]公共类BookController :控制器底座{.}或者行为头部

[HttpGet(' { id } ')][notFoundResultFilter]public iactionResultGetByID(int id){ var item=_ books .first or default(p=p . BookId==id);返回Ok(项目);}你还可以在添加手动音量调节服务的时候配置他们

public void ConfigureServices(IServiceCollection services){ services .AddMvc(o={ o . filters。添加(新的NotFoundResultFilterAttribute());});}选择一种重新运行项目之后,效果和通过修改配置移除默认的空值格式化器是一样的。

IAlwaysRunResultFilter

以上的几种解决方案看似完美无缺,但实际上还是存在一点瑕疵。由于ASP .网核心手动音量调节中过滤器的短路机制(即在任何一个过滤器中对结果赋值都会导致程序跳过管道中剩余的过滤器),可能现在使用某些第三方组件后,第三方组件在管道中插入自己的短路过滤器,从而导致我们的代码失效。

ASP .网核心手动音量调节的过滤器,可以参见这篇文章

下面我们添加以下的短路过滤器。

公共类短路filterattribute : ActionFilterAttribute { public override void on action executing(action executing context){ context } .结果=新对象结果(空);}}然后修改图书控制器中GetById的方法

[HttpGet(' { id } ')][短路筛选器][notFoundActionFilter]public IActionResult GetById(int id){ var item=_ books .first or default(p=p . BookId==id);返回Ok(项目);}重新运行程序后,使用邮递员访问/api/book/3,程序又返回了204不满足,这说明我们的代码失效了。

这时候,为了解决这个问题,我们需要使用。网络核心2.1中新引入的接口IAlwaysRunResultFilter。实现IAlwaysRunResultFilter接口的过滤器总是会执行,不论前面的过滤器是否触发短路。

这里我们添加一个新的过滤器NotFoundAlwaysRunFilterAttribute。

公共类NotFoundAlwaysRunFilterAttribute :属性,ialway srunresultfilter { public void on resultexecuted(resultexecuted)上下文){ public void on resultexecuting(resultexecuting context){ if(context)} .结果是对象结果对象结果对象结果值==空){ 0上下文result=new NotFoundResult();} }}然后我们继续修改图书控制器中的GetById方法,为其添加NotFoundAlwaysRunFilter特性

[HttpGet(' { id } ')][短路过滤器][notFoundActionFilter][notFoundAlwaysrunFilter]public IActionResult GetById(int id){ var item=_ books .first or default(p=p . BookId==id);返回Ok(项目);}重新运行程序后,使用邮递员访问/api/book/3,程序又成功返回了404未找到,这说明我们的代码又生效了。

本篇源代码:https://github。com/lamondlu/NullAction(本地下载)

原文地址:https://www .斯特拉斯韦布。com/2018/10/convert-null-value-result-to-404 in-ASP-net-core-MVC/

作者:菲利普西

译者拉蒙路:号

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

版权声明:详细说明ASP.NET芯MVC中空心返回值的处理方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。