如何在Asp.Net Core MVC中处理null值的实现
译文链接
传统的 asp. mvc 对应着 .core 中的 asp. core mvc,可以利用 asp. core mvc 去构建跨平台,可扩展,高性能的web应用和 api 接口。
程序员都有一些洁癖,很多时候我们都想很完美的包装一些错误信息,如一些返回空response的request请求,或者一些 action 中返回 null value 的情况,通常这些情况下,asp. core mvc 都会返回 http status 204 (No Content),在本篇中,我准备修改一下这种从 action 返回 null value 的默认行为。
要想运行本篇的例子,你需要安装一下 Visual Studio 2019,如果没有安装,可以到官网安装一下 或者本地下载
在 Asp.NET Core 中新建 Controller
在解决方案窗口中的 Controller 文件夹上右键并选择 Add -> Controller 去新建Controller,指定这个 Controller 的名字为 DemoController,接下来用狼蚁网站SEO优化的代码替换 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
狼蚁网站SEO优化是一个 Repository 类,里面包含了一个返回 null 的 GetMessage 方法,这仅仅是为了演示目的。
public class Repository { public string GetMessage() { return null; } }
在 asp. core mvc 中如何处理 null 值
当用 httpGet 的方式去请求 DemoController 的 GetMessage 方法,mvc 会返回 Http Status 204 (No Content),如下图所示
为什么会这样呢?当response准备返回时,asp. core mvc 会从当前可用的 格式化器 列表中选择一个合适的去处理当前的 response 对象,比如说这个格式化器可以是 Json formatter,又可以是 Xml formatter,或者任何合适于该资源的 formatter。
对了,当遇到 null 值时,asp. core mvc 框架会使用一个叫做 HttpNoContentOutputFormatter,它的职责就是将 null 转换成 Http Status 204(No Content),狼蚁网站SEO优化展示了源码实现
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. 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 的名字,狼蚁网站SEO优化就是 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),如狼蚁网站SEO优化图片所示
一个更完善的的返回 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. core mvc 时,你可以在 action 返回值处使用 IActionResult或 ActionResult<T> 或其他任何对象,在 Action 返回数据后,框架底层会对你的返回结果做必要的 序列化操作。
,当 action 返回 null 值时, asp. core mvc 并不会尝试用任何可用的序列化器去处理这个 null 值,换句话说,框架会返回 Http status 204,表示请求成功但无内容,幸运的是,你可以按需改变这个默认的行为。
到此这篇关于如何在Asp.Net Core MVC中处理null值的实现的文章就介绍到这了,更多相关Asp.Net Core MVC处理null值内容请搜索狼蚁SEO以前的文章或继续浏览狼蚁网站SEO优化的相关文章希望大家以后多多支持狼蚁SEO!
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程