为什么如果WebAPI动作方法返回一个C#列表,而在Javascript Backbone中收到的是一个对象而不是一个数组?

问题描述 投票:0回答:1

情况1

我有一个C# WebAPI的动作,它可以返回一个列表。

    [HttpGet]
    [Route("/views/documents")]
    [ValidateModelState]
    [SwaggerOperation("ViewsDocumentsGet")]
    [SwaggerResponse(statusCode: 200, type: typeof(List<Documents>), description: "...")]
    public virtual IActionResult ViewsDocumentsGet()
    {
        var result = new List<Documents>();
        ...
        return new ObjectResult(result);
    }

在客户端,有一个Backbone模型,它可以获取文件。

import { Model } from "backbone";
export default Model.extend({
initialize: function() {
    this._url = arguments[0];
},

url: function(strSwitch) {
    return this._url + `/views/documents`;
},

...
});

我在模型上调用fetch

  const response = await this.DocumentsModel.fetch();
  console.log(typeof response, response);

console.log返回

object (14) [
0: {DocType: "...", ...}
1: {DocType: "...", ...}
2: ... 
length: 14
__proto__: Array(0)

response的类型是object。我期望的是数组。


情况2

如果我将WebAPI动作方法改为返回一个包裹列表的对象,那么响应就是一个数组。

    [DataContract]
    public class DocumentWrapper
    {
        ...
        [DataMember]
        public List<Document> Documents { get; set; }
        ...
    }

    [HttpGet]
    [Route("/views/documents")]
    [ValidateModelState]
    [SwaggerOperation("ViewsDocumentsGet")]
    [SwaggerResponse(statusCode: 200, type: typeof(DocumentWrapper), description: "...")]
    public virtual IActionResult ViewsDocumentsGet()
    {
        var result = new DocumentWrapper();
        ...
        return new ObjectResult(result);
    }

现在响应的类型仍然是对象,但对象有一个属性Documents,它是一个数组。

object {Documents: Array(14)}
        Documents: Array(14)
        0: {DocType: "...", ...}
        1: {DocType: "...", ...}
        2: ... 
        length: 14
        __proto__: Array(0)
    __proto__: Object

在情况1中,我知道如何将对象转换为一个数组。但我不想这样做。我想让backbone从API中获取一个数组,而不需要我做任何转换。

疑问

  1. 为什么C#列表不能自动成为数组?
  2. 如何告诉backbone获取一个数组而不是一个对象?
javascript c# backbone.js asp.net-core-webapi
1个回答
0
投票

骨干模型获取将模型的状态与从服务器获取的属性相结合,通过调用 Backbone.sync. 默认情况下,它使用 jQuery.ajax 进行RESTful JSON请求,并返回一个 jqXHR. 你可以重写它,以便使用不同的持久化策略,但它将始终返回一个jqXHR对象,因为在内部它正在进行ajax请求。

© www.soinside.com 2019 - 2024. All rights reserved.