译文链接:https://pletedTask; }}
禁用 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值内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!