zoukankan      html  css  js  c++  java
  • asp.net core mvc中自定义ActionResult

    在GitHub上有个项目,本来是作为自己研究学习.net core的Demo,没想到很多同学在看,还给了很多星,所以觉得应该升成3.0,整理一下,写成博分享给学习.net core的同学们。

    项目名称:Asp.NetCoreExperiment

    项目地址:https://github.com/axzxs2001/Asp.NetCoreExperiment

    asp.net core mvc的模板中返回前端时可以用IActionResult的子类,来区分不同的返回内容,那怎么来实现自定义的ActionResult呢?

    github代码如下:

    https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/Common/YamlResultDemo

    首先引用一个三方包

    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 = "成功"
                });
            }

    运行结果:

  • 相关阅读:
    祖国,让我为您写首歌
    提升信任度,是做网络营销成功的必由之路
    名字作诗已成流行语,你“OUT”了吧?
    腾飞天涯
    沈阳首个文化强市评价体系出炉,为沈阳文化振兴打分
    寄语“官员诗人”车延高:我挺你
    “自己选的路,就算跪着也要走完”引热议
    我在月光下想你
    国庆献礼谁为重
    gcc和g++的区别
  • 原文地址:https://www.cnblogs.com/axzxs2001/p/11736248.html
Copyright © 2011-2022 走看看