如何在Asp.Net Core MVC中处理null值的实现
副问题[/!--empirenews.page--]
译文链接:https://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,假如没有安装,可以到官网安装一下:https://visualstudio.microsoft.com/downloads/ 可能当地下载 https://www.jb51.net/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 返回数据后,框架底层会对你的返回功效做须要的 序列化操纵。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |