如何使用 ActionResult 发送抽象类型的集合

Posted

技术标签:

【中文标题】如何使用 ActionResult 发送抽象类型的集合【英文标题】:How to send Collection of abstract types with ActionResult 【发布时间】:2020-12-26 04:50:33 【问题描述】:

我正在尝试使用ActionResultController 中发回abstract 类型的集合。我不知道如何告诉序列化程序还包括派生类型的特定属性:

public abstract class Base

    public int Idget;set;

public class D1:Base

    public string D1Valueget;set;

public class D2:Base

    public bool IsD2Valueget;set;


public async Task<ActionResult<IEnumerable<Base>>> GetAll()

   var collection=new [] new D1   Id=1, D1Value="hi" ,new D2 Id=2, IsD2Value=true;
   return StatusCode(200,collection);

我怎样才能以一种简单而优雅的方式达到这个结果。我已经检查了JsonSerializer 选项,但在我的情况下,我不是进行序列化的人。

我得到了什么

[ "Id":1 ,   "Id":2 ]

我想要什么

[ "Id":1,"D1Value":"hi"  ,   "Id":2 , "IsD2Value":true ]

【问题讨论】:

能否请您编辑您的结果,因为它们是相同的。 这是一个错字,我的错。 @BercoviciAdrian,你可以把D1D2放入List&lt;object&gt;,然后直接返回,我已经更新了我的答案,希望对你有帮助。 【参考方案1】:

试试下面的代码:

 public async Task<ActionResult<IEnumerable<Base>>> GetAll()
        
             var collection = new List<object>() 
              
                 new D1  Id = 1, D1Value = "hi" , 
                 new D2  Id = 2, IsD2Value = true  
             ;
            return StatusCode(200, collection);
        

这是测试结果:

【讨论】:

"I have checked the JsonSerializer options but in my case i am not the one that is doing the serialization." @RafiHenig,好的,只是为了删除 JsonConvert.SerializeObject ,并直接返回List&lt;object&gt;,我已经更新了我的答案。

以上是关于如何使用 ActionResult 发送抽象类型的集合的主要内容,如果未能解决你的问题,请参考以下文章

获取 ArgumentException:升级到 .NET Core 2.2 后使用 ActionResult<JsonResult>> 作为返回类型的类型参数无效

Asp.net MVC 中Controller返回值类型ActionResult

Action 的返回值 ActionResult

Asp.net MVC 中Controller返回值类型ActionResult

MVC5-3 Result分析

如何使用 Ajax 调用在 API 中动态调用 ActionResult?