在 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
- /// <summary>
- /// YamlResul
- /// </summary>
- public class YamlResult : ActionResult
- {
- /// <summary>
- /// YAML 值
- /// </summary>
- public object Value { get; private set; }
- /// <summary>
- /// 构造
- /// </summary>
- /// <param name="value"></param>
- public YamlResult(object value)
- {
- Value = value;
- }
- /// <summary>
- /// Result 执行者
- /// </summary>
- /// <param name="context"> 上下文 </param>
- /// <returns></returns>
- public override async Task ExecuteResultAsync(ActionContext context)
- {
- var services = context.HttpContext.RequestServices;
- var executor = services.GetRequiredService<IActionResultExecutor<YamlResult>>();
- await executor.ExecuteAsync(context, new YamlResult(this));
- }
- }
YamlResultExecutor.cs
- /// <summary>
- /// YamlResult 执行者
- /// </summary>
- /// <typeparam name="T"></typeparam>
- public class YamlResultExecutor<T> : IActionResultExecutor<T> where T : YamlResult
- {
- /// <summary>
- /// 执行
- /// </summary>
- /// <param name="context"> 上下文 </param>
- /// <param name="result"> 值 </param>
- /// <returns></returns>
- public async Task ExecuteAsync(ActionContext context, T result)
- {
- var serialize = new YamlDotNet.Serialization.Serializer();
- var valueString = serialize.Serialize(result.Value);
- // 把对象转成 YAML 字符串, 用 Response 返回
- context.HttpContext.Response.ContentType = "Content-Type: text/html; charset=utf-8";
- await context.HttpContext.Response.WriteAsync(valueString);
- }
- }
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 = "成功"
- });
- }
运行结果:
来源: https://www.cnblogs.com/axzxs2001/p/11736248.html