日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時(shí)間:2023/12/4 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在 Asp.Net Core MVC 中处理 null 值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

譯文鏈接: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,如果沒有安裝,可以到官網(wǎng)安裝一下:https://visualstudio.microsoft.com/downloads/

在 Asp.NET Core 中新建 Controller

在解決方案窗口中的 Controller 文件夾上右鍵并選擇 Add -> Controller 去新建Controller,指定這個(gè) 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);}}

創(chuàng)建一個(gè) Repository

下面是一個(gè) Repository 類,里面包含了一個(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ì)象,比如說:這個(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 類的 ConfigureServices 方法做如下配置。

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

上面的代碼禁用了 http status 204 的行為,取而代之的就是返回 http status 200 (OK),然后 null 值會(huì)被塞到 response body 中。

在 Asp.Net Core 中返回 http status 404

為了能夠達(dá)到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);}??????}

當(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.Resultas?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 值,換句話說,框架會(huì)返回 Http status 204,表示請(qǐng)求成功但無內(nèi)容,幸運(yùn)的是,你可以按需改變這個(gè)默認(rèn)的行為。

總結(jié)

以上是生活随笔為你收集整理的如何在 Asp.Net Core MVC 中处理 null 值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。