2017-02-16 18 views
1

Итак, у меня есть сценарий master/detail между двумя видами. На главной странице отображается список и после нажатия на один из элементов я отправляю сообщение через EventAggregator в Aurelia в дочернее представление с десериализованным dto (исходящим из выбранного элемента мастера) в качестве полезной нагрузки сообщения.Ошибка обработки сериализации клиента 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, поэтому мне что-то не хватает, любые советы будут оценены.

Edit 1

Это, кажется, что-то неправильно с тем, как я взаимодействовать с ServiceStack. Я использую версию 4.5.6 serviceStack с [email protected]^0.0.17. Я попробовал обновить новую копию 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