如何在Asp.Net Core MVC中處理null值的實(shí)現(xiàn)
譯文鏈接:https://www.infoworld.com/article/3434624/how-to-handle-null-values-in-aspnet-core-mvc.html
傳統(tǒng)的 asp.net mvc 對(duì)應(yīng)著 .netcore 中的 asp.net core mvc,可以利用 asp.net core mvc 去構(gòu)建跨平臺(tái),可擴(kuò)展,高性能的web應(yīng)用和 api 接口。
程序員都有一些潔癖,很多時(shí)候我們都想很完美的包裝一些錯(cuò)誤信息,如一些返回空response的request請(qǐng)求,或者一些 action 中返回 null value 的情況,通常這些情況下,asp.net core mvc 都會(huì)返回 http status 204 (No Content),在本篇中,我準(zhǔn)備修改一下這種從 action 返回 null value 的默認(rèn)行為。
要想運(yùn)行本篇的例子,你需要安裝一下 Visual Studio 2019,如果沒(méi)有安裝,可以到官網(wǎng)安裝一下:https://visualstudio.microsoft.com/downloads/ 或者本地下載 http://www.dbjr.com.cn/softs/618313.html
在 Asp.NET Core 中新建 Controller
在解決方案窗口中的 Controller 文件夾上右鍵并選擇 Add -> Controller 去新建Controller,指定這個(gè) Controller 的名字為 DemoController,接下來(lái)用下面的代碼替換 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); } }
創(chuàng)建一個(gè) Repository
下面是一個(gè) Repository 類(lèi),里面包含了一個(gè)返回 null 的 GetMessage 方法,當(dāng)然這僅僅是為了演示目的。
public class Repository { public string GetMessage() { return null; } }
在 asp.net core mvc 中如何處理 null 值
當(dāng)用 httpGet 的方式去請(qǐng)求 DemoController 的 GetMessage 方法,mvc 會(huì)返回 Http Status 204 (No Content),如下圖所示:
為什么會(huì)這樣呢?當(dāng)response準(zhǔn)備返回時(shí),asp.net core mvc 會(huì)從當(dāng)前可用的 格式化器 列表中選擇一個(gè)合適的去處理當(dāng)前的 response 對(duì)象,比如說(shuō):這個(gè)格式化器可以是 Json formatter,又可以是 Xml formatter,或者任何合適于該資源的 formatter。
對(duì)了,當(dāng)遇到 null 值時(shí),asp.net core mvc 框架會(huì)使用一個(gè)叫做 HttpNoContentOutputFormatter,它的職責(zé)就是將 null 轉(zhuǎn)換成 Http Status 204(No Content),下面展示了源碼實(shí)現(xiàn):
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 值的默認(rèn)行為,如果要這么做的話,在 Startup 類(lèi)的 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 值會(huì)被塞到 response body 中。
在 Asp.Net Core 中返回 http status 404
為了能夠達(dá)到404的效果,我來(lái)更新一下 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); } }
當(dāng)你再次請(qǐng)求 DemoController 時(shí),框架會(huì)返回 http status 404(Not Found),如下面圖片所示:
一個(gè)更完善的的返回 http 404 的方式
一個(gè)更好的返回 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(); } } }
你可以將這個(gè) filter 放置在 action級(jí)別,controller級(jí)別 或者 全局級(jí)別,如果你要放到全局級(jí)別,可以在 Startup 的 ConfigureServices 方法中新增如下代碼:
public void ConfigureServices(IServiceCollection services) { services.AddMvc(f => { f.Filters.Add(new NotFoundResultFilterAttribute()); }); }
當(dāng)在使用 asp.net core mvc 時(shí),你可以在 action 返回值處使用 IActionResult或 ActionResult<T> 或其他任何對(duì)象,在 Action 返回?cái)?shù)據(jù)后,框架底層會(huì)對(duì)你的返回結(jié)果做必要的 序列化操作。
然而,當(dāng) action 返回 null 值時(shí), asp.net core mvc 并不會(huì)嘗試用任何可用的序列化器去處理這個(gè) null 值,換句話說(shuō),框架會(huì)返回 Http status 204,表示請(qǐng)求成功但無(wú)內(nèi)容,幸運(yùn)的是,你可以按需改變這個(gè)默認(rèn)的行為。
到此這篇關(guān)于如何在Asp.Net Core MVC中處理null值的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Asp.Net Core MVC處理null值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- ASP.NET Core MVC 過(guò)濾器的使用方法介紹
- asp.net core MVC 過(guò)濾器之ActionFilter過(guò)濾器(2)
- asp.net?core?MVC?全局過(guò)濾器之ExceptionFilter過(guò)濾器(1)
- ASP.NET Core MVC 修改視圖的默認(rèn)路徑及其實(shí)現(xiàn)原理解析
- asp.net core MVC之實(shí)現(xiàn)基于token的認(rèn)證
- ASP.NET Core MVC解決控制器同名Action請(qǐng)求不明確的問(wèn)題
- ASP.NET Core MVC如何實(shí)現(xiàn)運(yùn)行時(shí)動(dòng)態(tài)定義Controller類(lèi)型
- ASP.NET Core MVC/WebApi基礎(chǔ)系列2
- ASP.NET Core MVC/WebApi基礎(chǔ)系列1
- 如何使用Rotativa在ASP.NET Core MVC中創(chuàng)建PDF詳解
- ASP.NET Core Mvc中空返回值的處理方法詳解
- ASP.NET Core MVC 過(guò)濾器(Filter)
相關(guān)文章
ASP.NET Core中的對(duì)象池化技術(shù)詳解
這篇文章主要為大家詳細(xì)介紹了ASP.NET Core中的對(duì)象池化技術(shù)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01asp.net(c#)復(fù)數(shù)類(lèi)(復(fù)數(shù)加減乘除四則運(yùn)算)
asp.net(c#)復(fù)數(shù)類(lèi)(復(fù)數(shù)加減乘除四則運(yùn)算)...2007-06-06IIS7中ASP.net 請(qǐng)求處理過(guò)程說(shuō)明
IIS7 站點(diǎn)啟動(dòng)并處理請(qǐng)求的步驟如下,在iis7中處理asp.net的朋友可以參考下。2011-02-02Asp.net利用JQuery AJAX實(shí)現(xiàn)無(wú)刷新評(píng)論思路與代碼
Asp.net利用JQuery AJAX實(shí)現(xiàn)無(wú)刷新評(píng)論,此功能是每一個(gè)從事asp.net開(kāi)發(fā)者的朋友都希望實(shí)現(xiàn)的,本文利用閑暇時(shí)間整理了一些,有需要的朋友可以參考下2012-12-12