您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)Asp.Net Core 中的null值如何進(jìn)行處理,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
在 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)的行為。
看完上述內(nèi)容,你們對(duì)Asp.Net Core 中的null值如何進(jìn)行處理有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。