2017-02-16 56 views
1

所以我有两个视图之间的主/细节方案。母版页显示一个列表,在点击其中一个项目后,我通过Aurelia的EventAggregator发送一条消息到子视图,并带有一个反序列化的dto(来自主设备的选定项目)作为消息的有效载荷。Javascript ServiceStack客户机序列化错误

但是,当我然后尝试将该项目作为子项中后续请求的参数(以获取其他信息)时,有效内容对象无法序列化。

Master.ts:

import { JsonServiceClient } from "servicestack-client"; 
import { 
    ListPendingHoldingsFiles, 
    ListPendingHoldingsFilesResponse, 
    SendHoldings, 
    PositionFileInfo 
} from "../holdingsManager.dtos"; 
import { inject, singleton } from "aurelia-framework"; 
import { Router } from "aurelia-router"; 
import { EventAggregator } from "aurelia-event-aggregator"; 
import { GetPendingPositionMessage } from "../common/GetPendingPositionMessage"; 

@singleton() 
@inject(Router, EventAggregator) 
export class Pending { 
    router: Router; 
    positions: PositionFileInfo[]; 
    client: JsonServiceClient; 
    eventAgg: EventAggregator; 

    constructor(router, eventAggregator) { 
     this.router = router; 
     this.eventAgg = eventAggregator; 
     this.client = new JsonServiceClient('/'); 
     var req = new ListPendingHoldingsFiles(); 
     this.client.get(req).then((getHoldingsResponse) => { 
      this.positions = getHoldingsResponse.PositionFiles; 
     }).catch(e => { 
      console.log(e); // "oh, no!" 
     }); 
    } 

    openHoldings(positionInfo) { 
     this.eventAgg.publish(new GetPendingPositionMessage(positionInfo)); 
     this.router.navigate('#/holdings'); 
    } 
} 

Child.ts:

import { JsonServiceClient } from "servicestack-client"; 
import { inject, singleton } from "aurelia-framework"; 
import { Router } from 'aurelia-router'; 
import { EventAggregator } from "aurelia-event-aggregator"; 
import { GetPendingPositionMessage } from "../common/GetPendingPositionMessage"; 
import { 
    GetPendingHoldingsFile, 
    GetPendingHoldingsFileResponse, 
    Position, 
    PositionFileInfo 
} from "../holdingsManager.dtos"; 

@singleton() 
@inject(Router, EventAggregator) 
export class Holdings { 
    router: Router; 
    pendingPositionFileInfo: PositionFileInfo; 
    position: Position; 
    client: JsonServiceClient; 
    eventAgg: EventAggregator; 

    constructor(router, eventAggregator) { 
     this.router = router; 
     this.eventAgg = eventAggregator; 
     this.eventAgg.subscribe(GetPendingPositionMessage, 
      message => { 
       this.pendingPositionFileInfo = message.fileInfo; 
      }); 
    } 

    activate(params, routeData) { 
     this.client = new JsonServiceClient('/'); 
     var req = new GetPendingHoldingsFile(); 
     req.PositionToRetrieve = this.pendingPositionFileInfo; 
     this.client.get(req).then((getHoldingsResponse) => { 
      this.position = getHoldingsResponse.PendingPosition; 
     }).catch(e => { 
      console.log(e); // "oh, no!" 
     }); 
    } 
} 

所以,当孩子激活并试图发送请求 'GetPendingHoldingsFile' 错误发生。

Failed to load resource: the server responded with a status of 500 (NullReferenceException) 

我已验证this.pendingPositionFileInfo在孩子不为空或空,并且在服务器端,没有接收对象(它为空)。我是Aurelia的新手,并且对Javascript使用经验不足,所以我必须缺少一些东西,任何建议都不胜感激。

编辑1

这似乎是坏了我如何与ServiceStack交互。我正在使用serviceStack版本4.5.6的[email protected]^0.07。我尝试新建一个dto(PositionFileInfo)的新副本,并复制父视图中的所有值,以确保没有发生某些我不知道的JavaScript类型转换奇怪事件,但即使使用了新鲜dto webservice仍然收到一个空请求。

+0

不要在这里使用Event Aggregator ...太复杂和冗余的路由器。只需保存当前记录'this.positionInfo = positionInfo;',然后路由到您的孩子并让您的孩子导入/注入父母并获取当前记录。 – LStarky

+0

几个很好的演示类似的情况在这里:http://stackoverflow.com/questions/42260833/aurelia-how-can-i-modify-sidebar-content-from-inside-a-router-view – LStarky

+0

感谢您的提示,不幸的是,这并不能解决序列化问题。 – Bitfiddler

回答

1

从'client.get(...)'切换到'client.post(...)'修复了这个问题。显然试图在URL中序列化对象并不是一个好计划。

+0

绝对是一个更好的计划!我没有注意到你的代码,但你完全正确。 – LStarky