如何在Asp.Net Core MVC中處理null值的實現(xiàn)
譯文鏈接:https://www.infoworld.com/article/3434624/how-to-handle-null-values-in-aspnet-core-mvc.html
傳統(tǒng)的 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,如果沒有安裝,可以到官網(wǎng)安裝一下:https://visualstudio.microsoft.com/downloads/ 或者本地下載 http://www.fzitv.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);
}
}
創(chuàng)建一個 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),下面展示了源碼實現(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 值的默認行為,如果要這么做的話,在 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 返回數(shù)據(jù)后,框架底層會對你的返回結果做必要的 序列化操作。
然而,當 action 返回 null 值時, asp.net core mvc 并不會嘗試用任何可用的序列化器去處理這個 null 值,換句話說,框架會返回 Http status 204,表示請求成功但無內容,幸運的是,你可以按需改變這個默認的行為。
到此這篇關于如何在Asp.Net Core MVC中處理null值的實現(xiàn)的文章就介紹到這了,更多相關Asp.Net Core MVC處理null值內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- ASP.NET Core MVC 過濾器的使用方法介紹
- asp.net core MVC 過濾器之ActionFilter過濾器(2)
- asp.net?core?MVC?全局過濾器之ExceptionFilter過濾器(1)
- ASP.NET Core MVC 修改視圖的默認路徑及其實現(xiàn)原理解析
- asp.net core MVC之實現(xiàn)基于token的認證
- ASP.NET Core MVC解決控制器同名Action請求不明確的問題
- ASP.NET Core MVC如何實現(xiàn)運行時動態(tài)定義Controller類型
- ASP.NET Core MVC/WebApi基礎系列2
- ASP.NET Core MVC/WebApi基礎系列1
- 如何使用Rotativa在ASP.NET Core MVC中創(chuàng)建PDF詳解
- ASP.NET Core Mvc中空返回值的處理方法詳解
- ASP.NET Core MVC 過濾器(Filter)
相關文章
Asp.net 動態(tài)加載用戶自定義控件,并轉換成HTML代碼
Ajax現(xiàn)在已經(jīng)是相當流行的技術了,Ajax不僅是想服務器端發(fā)送消息,更重要的是無刷新的重載頁面。2010-03-03
WPF數(shù)據(jù)綁定中的RelativeSource屬性
這篇文章介紹了WPF數(shù)據(jù)綁定中的RelativeSource屬性,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04
使用asp.net MVC4中的Bundle遇到的問題及解決辦法分享
這篇文章主要介紹了使用asp.net MVC4中的Bundle遇到的問題及解決辦法,需要的朋友可以參考下2014-02-02
ASP.NET Core Api網(wǎng)關Ocelot的使用初探
這篇文章主要介紹了ASP.NET Core Api網(wǎng)關Ocelot的使用初探,幫助大家更好的理解和學習使用.NET技術,感興趣的朋友可以了解下2021-03-03

