Итак, у меня есть сценарий 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 все равно получает нулевой запрос.
Не используйте Event Aggregator здесь ... Слишком сложный и избыточный с маршрутизатором. Просто сохраните текущую запись 'this.positionInfo = positionInfo;', затем перейдите к вашему ребенку и попросите своего ребенка импортировать/вставить родительский элемент и получить текущую запись. – LStarky
Несколько хороших демонстраций подобного случая здесь: http://stackoverflow.com/questions/42260833/aurelia-how-can-i-modify-sidebar-content-from-inside-a-router-view – LStarky
Спасибо за подсказку, к сожалению, это не разрешает проблему сериализации. – Bitfiddler