情况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中获取一个数组,而不需要我做任何转换。
疑问
骨干模型获取将模型的状态与从服务器获取的属性相结合,通过调用 Backbone.sync
. 默认情况下,它使用 jQuery.ajax
进行RESTful JSON请求,并返回一个 jqXHR
. 你可以重写它,以便使用不同的持久化策略,但它将始终返回一个jqXHR对象,因为在内部它正在进行ajax请求。