华域联盟 .Net 如何在Asp.Net Core MVC中处理null值的实现

如何在Asp.Net Core MVC中处理null值的实现

如何在Asp.Net Core MVC中处理null值的实现
 更新时间:2020年12月01日 10:37:12   作者:DotNET技术圈  

这篇文章主要介绍了如何在Asp.Net Core MVC中处理null值的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

译文链接:www.infoworld.com/article/3434624/how-to-handle-null-values-in-aspnet-core-mvc.html
传统的 asp.net mvc 对应着 .netcore 中的 asp.net core mvc,可以利用 asp.net core mvc 去构建跨平台,可扩展,高性能的web应用和 api 接口。
程序员都有一些洁癖,很多时候我们都想很完美的包装一些错误信息,如一些返回空response的request请求,或者一些 action 中返回 null value 的情况,通常这些情况下,asp.net core mvc 都会返回 http status 204 (No Content),在本篇中,我准备修改一下这种从 action 返回 null value 的默认行为。
要想运行本篇的例子,你需要安装一下 Visual Studio 2019,如果没有安装,可以到官网安装一下:visualstudio.microsoft.com/downloads/ 或者本地下载 www.cnhackhy.com/softs/618313.html 
在 Asp.NET Core 中新建 Controller

在解决方案窗口中的 Controller 文件夹上右键并选择 Add -> Controller 去新建Controller,指定这个 Controller 的名字为 DemoController,接下来用下面的代码替换 DemoController。

[Route("api/[controller]")] [ApiController] public class DemoController : ControllerBase
{
readonly Repository repository = new Repository();

[HttpGet] public ActionResult Get()
{
string item = repository.GetMessage();
return Ok(item);
}

[HttpGet("{id}", Name = "Get")] public IActionResult Get(int id)
{
string item = repository.GetMessage();
return Ok(item);
}
}

创建一个 Repository

下面是一个 Repository 类,里面包含了一个返回 null 的 GetMessage 方法,当然这仅仅是为了演示目的。

public class Repository
{
public string GetMessage()
{
return null;
}
}

在 asp.net core mvc 中如何处理 null 值

当用 httpGet 的方式去请求 DemoController 的 GetMessage 方法,mvc 会返回 Http Status 204 (No Content),如下图所示:

为什么会这样呢?当response准备返回时,asp.net core mvc 会从当前可用的 格式化器 列表中选择一个合适的去处理当前的 response 对象,比如说:这个格式化器可以是 Json formatter,又可以是 Xml formatter,或者任何合适于该资源的 formatter。
对了,当遇到 null 值时,asp.net core mvc 框架会使用一个叫做 HttpNoContentOutputFormatter,它的职责就是将 null 转换成 Http Status 204(No Content),下面展示了源码实现:

public class HttpNoContentOutputFormatter : IOutputFormatter
{
public Task WriteAsync(OutputFormatterWriteContext context)
{
HttpResponse response = context.HttpContext.Response;
response.ContentLength = 0L;
if (response.StatusCode == 200)
{
response.StatusCode = 204;
}
return Task.CompletedTask;
}
}

禁用 HttpNoContentOutputFormatter

如果你好奇的话,可以把 HttpNoContentOutputFormatter 禁用掉,这样就切断了 asp.net mvc core 处理 null 值的默认行为,如果要这么做的话,在 Startup 类的 ConfigureServices 方法做如下配置。

services.AddMvc(f =>
{
f.OutputFormatters.RemoveType
(typeof(HttpNoContentOutputFormatter));
f.OutputFormatters.Insert(0, new
HttpNoContentOutputFormatter
{
TreatNullValueAsNoContent = false
});
});

上面的代码禁用了 http status 204 的行为,取而代之的就是返回 http status 200 (OK),然后 null 值会被塞到 response body 中。
在 Asp.Net Core 中返回 http status 404

为了能够达到404的效果,我来更新一下 action 的名字,下面就是 DemoController 更新后的代码片段:

[Route("api/[controller]")] [ApiController] public class DemoController : ControllerBase
{
readonly Repository repository = new Repository();
[HttpGet] public ActionResult Get()
{
string item = repository.GetMessage();
if (item == null)
return NotFound();
return Ok(item);
}
}

当你再次请求 DemoController 时,框架会返回 http status 404(Not Found),如下面图片所示:

一个更完善的的返回 http 404 的方式

一个更好的返回 http status 404 的方式是使用 action filter 或者 result filter,如下代码:

public class NotFoundActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
if (context.Result is ObjectResult)
{
ObjectResult objectResult = context.Result
as ObjectResult;
if (objectResult.Value == null)
context.Result = new NotFoundResult();
}
}
}

你可以将这个 filter 放置在 action级别,controller级别 或者 全局级别,如果你要放到全局级别,可以在 Startup 的 ConfigureServices 方法中新增如下代码:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(f =>
{
f.Filters.Add(new NotFoundResultFilterAttribute());
});
}

当在使用 asp.net core mvc 时,你可以在 action 返回值处使用 IActionResult或 ActionResult<T> 或其他任何对象,在 Action 返回数据后,框架底层会对你的返回结果做必要的 序列化操作。
然而,当 action 返回 null 值时, asp.net core mvc 并不会尝试用任何可用的序列化器去处理这个 null 值,换句话说,框架会返回 Http status 204,表示请求成功但无内容,幸运的是,你可以按需改变这个默认的行为。

到此这篇关于如何在Asp.Net Core MVC中处理null值的实现的文章就介绍到这了,更多相关Asp.Net Core MVC处理null值内容请搜索华域联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持华域联盟!

您可能感兴趣的文章:asp.net mvc webapi 实用的接口加密方法示例ASP.NET Core MVC解决控制器同名Action请求不明确的问题创建一个ASP.NET MVC5项目的实现方法(图文)ASP.NET Core MVC如何实现运行时动态定义Controller类型asp.net mvc core管道及拦截器的理解ASP.NET Core MVC获取请求的参数方法示例ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径的实现在ASP.NET Core Mvc集成MarkDown的方法ASP.NET Core MVC 中实现中英文切换的示例代码如何使用签名保证ASP.NET MVC OR WEBAPI的接口安全

Asp.Net
Core
MVC
null

相关文章
asp.net显示自己的网页图标的几种方式多tab的浏览器,你一定会发现tab前边的个性图标,关于这个东西有好几种做法,下面与大家分享下 2014-05-05
Asp.Net实现404页面与301重定向的方法这篇文章主要介绍了Asp.Net实现404页面与301重定向的方法,较为详细的分析了404页面的原理与针对404错误与301跳转的实现方法,是非常实用的技巧,需要的朋友可以参考下 2014-11-11
asp.net 获取TreeView中第一个选中的节点今天做的项目中有一个要获取TreeView中第一个选中的节点,当然子节点己包含checkbox以前做过,用的时候又不知道怎么做了,花了点时间又写了一下,记录下来,以备下次用. 2010-03-03
通过RadioButton对DataList控件进行单选实例说明本例实现通过RadioButton对DataList控件进行单选,aspx拉一个DataList控件,把RadioButton置于DataList的ItemTemplate模版内;在.aspx.cs内为DataList控件绑定数据,很实用的功能,感兴趣的朋友可以了解下啊 2013-01-01
.Net Core学习教程之在Mvc中简单的使用日志组件这篇文章主要给大家介绍了关于.Net Core学习教程之在Mvc中简单使用日志组件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2018-06-06
Discuz .net版本中的短消息系统Discuz .net 短消息实现原理。 2009-04-04
Visual Studio 2015安装步骤详解这篇文章主要为大家详细介绍了Visual Studio 2015安装步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2016-12-12
silverlight用webclient大文件上传的实例代码这篇文章介绍了silverlight用webclient大文件上传的实例代码,有需要的朋友可以参考一下 2013-10-10
ASP.NET生成二维码的方法总结这篇文章主要介绍了ASP.NET生成二维码的方法,结合实例形式总结分析了常用的几种二维码生成技巧,具有一定参考借鉴价值,需要的朋友可以参考下 2016-06-06
获取Repeter的Item和ItemIndex/CommandArgument实现思路与代码Repeater控件,放在ItemTemplate内的铵钮OnClick之后,获取Repeater的Item,ItemIndex,CommandArgument,CommandName以及绑定的字段值附演示动画感兴趣的朋友可以了解下 2013-01-01

最新评论

本文由 华域联盟 原创撰写:华域联盟 » 如何在Asp.Net Core MVC中处理null值的实现

转载请保留出处和原文链接:https://www.cnhackhy.com/5017.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者:

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部