在GitHub上有個項目,本來是作為自己研究學習.net core的Demo,沒想到很多同學在看,還給了很多星,所以覺得應該升成3.0,整理一下,寫成博分享給學習.net core的同學們。
項目名稱:Asp.NetCoreExperiment
項目地址:https://github.com/axzxs2001/Asp.NetCoreExperiment
asp.net core mvc的模板中返回前端時可以用IActionResult的子類,來區分不同的返回內容,那怎么來實現自定義的ActionResult呢?
github代碼如下:
首先引用一個三方包
PM> Install-Package YamlDotNet
YamlResult.cs
1 /// <summary> 2 /// YamlResul 3 /// </summary> 4 public class YamlResult : ActionResult 5 { 6 /// <summary> 7 /// Yaml值 8 /// </summary> 9 public object Value { get; private set; } 10 /// <summary> 11 /// 構造 12 /// </summary> 13 /// <param name="value"></param> 14 public YamlResult(object value) 15 { 16 Value = value; 17 } 18 /// <summary> 19 /// Result執行者 20 /// </summary> 21 /// <param name="context">上下文</param> 22 /// <returns></returns> 23 public override async Task ExecuteResultAsync(ActionContext context) 24 { 25 var services = context.HttpContext.RequestServices; 26 var executor = services.GetRequiredService<IActionResultExecutor<YamlResult>>(); 27 await executor.ExecuteAsync(context, new YamlResult(this)); 28 } 29 }
YamlResultExecutor.cs
1 /// <summary> 2 /// YamlResult執行者 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 public class YamlResultExecutor<T> : IActionResultExecutor<T> where T : YamlResult 6 { 7 /// <summary> 8 /// 執行 9 /// </summary> 10 /// <param name="context">上下文</param> 11 /// <param name="result">值</param> 12 /// <returns></returns> 13 public async Task ExecuteAsync(ActionContext context, T result) 14 { 15 var serialize = new YamlDotNet.Serialization.Serializer(); 16 var valueString = serialize.Serialize(result.Value); 17 // 把對象轉成yaml字符串,用Response返回 18 context.HttpContext.Response.ContentType = "Content-Type: text/html; charset=utf-8"; 19 await context.HttpContext.Response.WriteAsync(valueString); 20 } 21 }
TestController.cs中調用代碼
[HttpGet] public IActionResult Get() { return new YamlResult(new { Data = new { a = 1, B = "bbb", C = DateTime.Now, d = new string[] { "a", "b", "c" } }, Status = true, Message = "成功" }); }
運行結果: