這篇文章主要介紹了如何在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 對應(yīng)著 .netcore 中的 asp.net core mvc,可以利用 asp.net core mvc 去構(gòu)建跨平臺,可擴展,高性能的web應(yīng)用和 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/ 或者本地下載 https://www.jb51.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 轉(zhuǎn)換成 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 或其他任何對象,在 Action 返回數(shù)據(jù)后,框架底層會對你的返回結(jié)果做必要的 序列化操作。
然而,當 action 返回 null 值時, asp.net core mvc 并不會嘗試用任何可用的序列化器去處理這個 null 值,換句話說,框架會返回 Http status 204,表示請求成功但無內(nèi)容,幸運的是,你可以按需改變這個默認的行為。
到此這篇關(guān)于如何在Asp.Net Core MVC中處理null值的實現(xiàn)的文章就介紹到這了,更多相關(guān)Asp.Net Core MVC處理null值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
來源:腳本之家
鏈接:https://www.jb51.net/article/201069.htm
申請創(chuàng)業(yè)報道,分享創(chuàng)業(yè)好點子。點擊此處,共同探討創(chuàng)業(yè)新機遇!