返回通用对象导致没有数据发送到客户端

时间:2016-02-24 21:37:55

标签: c# generics

使用Web API 2控制器将数据提供给Web客户端。

背景:

我使用过Visual Studio"提取方法"删除一些将在我的应用程序的其他地方重复使用的代码的功能。当然,默认情况下,它尽可能强地键入所有内容,并且提取的方法的用例是自动启用对jQGrid参数的支持并返回它期望的数据结构。知道我将使用它不仅仅是一种类型的数据,我将其调整为Generic。它看起来像这样:

    public class jQGridResult<T>
    {
        int total;
        int page;
        int records;
        List<T> rows;

        public jQGridResult(int totalPages, int page, int totalRecords, IQueryable<T> queryable)
        {
            // TODO: Complete member initialization
            this.total = totalPages;
            this.page = page;
            this.records = totalRecords;
            this.rows = queryable.ToList();
        }
    }

    public static jQGridResult<T> getjQGridResult<T>(int page, int rows, string sidx, string sord, ref IQueryable<T> result)
    {
        int totalRecords = result.Count();
        int totalPages = (int)Math.Ceiling((double)totalRecords / (double)rows);
        //Do some sorting if needed
        if (sord.Length > 0 && sidx.Length > 0)
        {
            if (sord == "desc")
                result = result.OrderByDescending(sidx);
            else
                result = result.OrderBy(sidx);
        }

        jQGridResult<T> jsonData = new jQGridResult<T>
        (
            totalPages,
            page,
            totalRecords,
            result.Skip((page - 1) * rows).Take(rows)
        );
        return jsonData;
    }

问题:

在WebApi控制器中通过return Ok(jsonData);返回此对象的结果(无论是直接创建还是通过方法创建)都不会给我任何回复。 (如果我返回原始列表,这可行,但当然不是所需的格式。)

我做错了什么,或帮助方法Ok()(创建IHttpActionResult)不支持序列化通用对象吗?

1 个答案:

答案 0 :(得分:1)

显然,默认的序列化错误处理是返回null而不是抛出任何东西。 一旦我尝试手动序列化,我当然得到一个错误消息,如: 类型'DCSite.apiTableOutputHelper + jQGridResult`1 [DCSite.DAL.SYS_PACKAGE_LOG]'无法序列化。请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员。如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记。有关其他受支持的类型,请参阅Microsoft .NET Framework文档。“

当然,解决方案在错误文本中进行了详细说明。 我只需要像这样装饰泛型类中的所有内容:

    [DataContractAttribute]
    public class jQGridResult<T>
    {
        [DataMember]
        int total;
        [DataMember]
        int page;
        [DataMember]
        int records;
        [DataMember]
        List<T> rows;

        public jQGridResult(int totalPages, int page, int totalRecords, IQueryable<T> queryable)
        {
            // TODO: Complete member initialization
            this.total = totalPages;
            this.page = page;
            this.records = totalRecords;
            this.rows = queryable.ToList();
        }
    }

现在一切都变得很好!