【问题标题】:Setting the response type for a HTTP GET Request to generic list (IEnumerable<T>) and receive it in Angular using HTTP GET将 HTTP GET 请求的响应类型设置为通用列表 (IEnumerable<T>) 并使用 HTTP GET 在 Angular 中接收它
【发布时间】:2020-07-26 15:54:10
【问题描述】:

我正在尝试创建一个 HTTP GET 方法,该方法返回一个通用列表 (IENumerable&lt;T&gt;),然后我的 Angular 应用程序可以使用 http.get 读取这些项目。

在处理来自 Angular 应用程序调用的 MVC 项目的控制器类中,我有以下方法:

[HttpGet(URLs.CustomField.GetCustomFieldsForMatterAsync)]
[ProducesResponseType(typeof(IEnumerable<CustomFieldGroup>), 200)]
public async Task<IEnumerable<CustomFieldDTO>> GetCustomFieldsByFileIDAsync(int fileID)
{
    // fetches the list from DB, stores in a variable called customFields

    List<CustomFieldDTO> list = new List<CustomFieldDTO>();

    foreach (CustomField customField in customFields)
    {
       switch (customField.CustomFieldType)
       {
          case CustomFieldType.Text:
          case CustomFieldType.DateTime: list.Add(_mapper.Map<CustomFieldDTO<string>>(customField)); break;
          case CustomFieldType.Boolean: list.Add(_mapper.Map<CustomFieldDTO<bool>>(customField)); break;
          case CustomFieldType.Currency: list.Add(_mapper.Map<CustomFieldDTO<decimal>>(customField)); break;
          case CustomFieldType.List:
          case CustomFieldType.Number: list.Add(_mapper.Map<CustomFieldDTO<int>>(customField)); break;
       }
    }

    return list;
}

我需要返回一个 customFields 的通用列表,以便 Angular 项目可以根据其类型正确处理该属性。 我不知何故需要将返回类型从IEnumerable&lt;CustomField&gt; 更改为IEnumerable&lt;CustomField&lt;T&gt;&gt;。值的类型可以是:string、bool、int、dateTime。

我最接近的方法是创建一个只包含值的 CustomField 抽象类。

public class CustomFieldDTO<T> : CustomFieldDTO
{
   public T Value { get; set; }
}

public abstract class CustomFieldDTO { // bunch of other variables }

通过这样做,我至少可以创建如上所示的 GetCustomFieldsByFileIDAsync 方法。 但是角度应用程序只是没有在 Value 属性中显示任何值。如何将通用类型的项目传递给 Angular?我不能说:[ProducesResponseType(typeof(IEnumerable&lt;CustomField&lt;T&gt;&gt;), 200)],因为那行不通。

还尝试将方法更改为:public async Task&lt;IEnumerable&lt;CustomFieldDTO&lt;T&gt;&gt;&gt; GetCustomFieldsByFileIDAsync&lt;T&gt;(int fileID) 但 angular 说找不到它????

在角度,我正在这样做:

    this.http.get<CustomField<any>>(URLs.GetCustomFieldsForMatter(fileID)).subscribe(customFields => 
    {
        console.log(customFields);
    });

有什么办法可以实现吗?

【问题讨论】:

  • 尝试用List&lt;object&gt;替换CustomFieldDTO&lt;T&gt;
  • 嘿,这确实有效!不知道为什么在那段时间之后我从来没有想过这个。我知道它并不理想(对象是全部),但它是一个答案(如果你想让它成为一个答案)。

标签: c# angular asp.net-mvc typescript asp.net-core


【解决方案1】:

我认为泛型有问题,将返回的CustomerFieldDTO&lt;T&gt; 替换为List&lt;object&gt;

public async Task<IEnumerable<object>> GetCustomFieldsByFileIDAsync(int fileID)
{
    List<object> list = new List<object>();

    // More code

    return list;
}

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多