使用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)不支持序列化通用对象吗?
答案 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();
}
}
现在一切都变得很好!