Hi guys,
I'm totallay new to the the aspnetzero and angular so please bear with me.
My objective is to create a procurement request form. Form has some generic fields and 2 areas where user can add products and invitees to the request.
Project type: Angular/Core I have 3 objects as follows: PEvent PEventProduct (Contains PEventID, ProductID, and fields like quantity required) PEventInvitee Product
I have no problems saving the initial Pevent Object but once inserted I need to get the object immediatly so that I can save products and invitees associated to it as well. Below code works for the first part where I insert the pevent. But it fails on second part stating EventId must be between 1 and 2147483647 I believe the problem will be solved if I can get the inserted objects eventid and pass it to neweventproduct.eventid.
The question is whether it is possible to get the resulting object after insert operation.
save(): void {
this._procurementService.createPEvent(this.pevent)
.finally(() => this.saving = false)
.subscribe(() => {
this.notify.info(this.l('SavedSuccessfully'));
});
//works up to here without a problem
//this.newEventProduct.EventId = <- Pass EventID here from the result
this._procurementService.addEventProduct(this.newEventProduct).subscribe(
result => {
this.editingPevent.eventProducts.push(result);
this.newEventProduct.quantity = 1;
this.notify.success(this.l('SavedSuccessfully'))
});
//errors here stating EventId must be between 1 and 2147483647
}
13 Answer(s)
-
0
this._procurementService.createPEvent(this.pevent) .then(result => { this.newEventProduct.EventId = result.Id; this._procurementService.addEventProduct(this.newEventProduct).subscribe( result => { this.editingPevent.eventProducts.push(result); this.newEventProduct.quantity = 1; this.notify.success(this.l('SavedSuccessfully')) }); }) .finally(() => this.saving = false) .subscribe(() => { this.notify.info(this.l('SavedSuccessfully')); });
-
0
Thank you aaron for your response I was away for a few days. ( my wife was in labor and I took a few days off :D ).
I have tested out the .then statement but it is throwing an error saying "then does not exist on type 'Observable <void>' "
I have imported import { Observable } from 'rxjs/Observable'; but this does not resolve the problem. Am I missing something?
-
0
my wife was in labor and I took a few days off :D
Congrats!
I have tested out the .then statement but it is throwing an error saying "then does not exist on type 'Observable <void>' "
Misconception on my part. This should work:
this._procurementService.createPEvent(this.pevent) .finally(() => this.saving = false) .subscribe(event => { this.notify.info(this.l('SavedSuccessfully')); this.newEventProduct.EventId = event.Id; this._procurementService.addEventProduct(this.newEventProduct).subscribe( result => { this.editingPevent.eventProducts.push(result); this.newEventProduct.quantity = 1; this.notify.success(this.l('SavedSuccessfully')) }); });
-
0
Thanks Aaron ,
after subscribe I have tried to check the event value using a simple alert but it shows null. The value is submitted to the database fine but still cant get the eventid. I'm probably missing something simple but no idea what.
alert(event); //returns null alert(event.Id); //returns null this.newEventProduct.EventId = event.Id;
-
0
Can you check the response in the Network tab of your browser's developer console?
-
0
-
0
Can you show the code for CreateOrEdit?
-
0
Here is the code in ts.
import { Component, ViewChild, Injector, Output, EventEmitter} from '@angular/core'; import { ModalDirective } from 'ngx-bootstrap'; import { ProcurementServiceProxy, CreateOrEditPEventDto} from '@shared/service-proxies/service-proxies'; import { AppComponentBase } from '@shared/common/app-component-base'; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/observable/fromPromise'; import 'rxjs/add/operator/toPromise'; @Component({ selector: 'createOrEditPEventModal', templateUrl: './create-or-edit-pEvent-modal.component.html' }) export class CreateOrEditPEventModalComponent extends AppComponentBase { @ViewChild('createOrEditModal') modal: ModalDirective; @Output() modalSave: EventEmitter<any> = new EventEmitter<any>(); active = false; saving = false; pEvent: CreateOrEditPEventDto = new CreateOrEditPEventDto(); constructor( injector: Injector, private _procurementServiceProxy: ProcurementServiceProxy ) { super(injector); } ngOnInit(): void { } show(pEventId?: number): void { if (!pEventId) { this.pEvent = new CreateOrEditPEventDto(); this.pEvent.id = pEventId; this.active = true; this.modal.show(); } else{ this._procurementServiceProxy.getPEventForEdit(pEventId).subscribe(pEventResult => { this.pEvent = pEventResult; this.active = true; this.modal.show(); }); } } save(): void { /* this.saving = true; this._procurementServiceProxy.createOrEdit(this.pEvent) .finally(() => { this.saving = false; }) .subscribe(() => { this.notify.info(this.l('SavedSuccessfully')); this.close(); this.modalSave.emit(null); }); */ this._procurementServiceProxy.createOrEdit(this.pEvent) .finally(() => this.saving = false) .subscribe(event => { this.notify.info(this.l('SavedSuccessfully')); alert(event); }); } close(): void { this.active = false; this.modal.hide(); } }
-
0
How about the server-side code?
-
0
using System; using System.Linq; using System.Linq.Dynamic.Core; using Abp.Linq.Extensions; using System.Collections.Generic; using System.Threading.Tasks; using Abp.Domain.Repositories; using Procure.Procurement.Dtos; using Abp.Application.Services.Dto; using Procure.Authorization; using Abp.Authorization; using Microsoft.EntityFrameworkCore; namespace Procure.Procurement { [AbpAuthorize(AppPermissions.Pages_Procurement)] public class ProcurementAppService : ProcureAppServiceBase, IProcurementAppService { private readonly IRepository<PEvent> _pEventRepository; public ProcurementAppService(IRepository<PEvent> pEventRepository) { _pEventRepository = pEventRepository; } public async Task<PagedResultDto<PEventDto>> GetAll(GetAllPEventsInput input) { var query = _pEventRepository.GetAll().WhereIf( !string.IsNullOrWhiteSpace(input.Filter), e => e.Title.Contains(input.Filter) || e.Description.Contains(input.Filter) ); var totalCount = await query.CountAsync(); var pEvents = await query .OrderBy(input.Sorting ?? "id asc") .PageBy(input) .ToListAsync(); return new PagedResultDto<PEventDto>( totalCount, ObjectMapper.Map<List<PEventDto>>(pEvents) ); } [AbpAuthorize(AppPermissions.Pages_Procurement_Edit)] public async Task<CreateOrEditPEventDto> GetPEventForEdit(EntityDto<int> input) { var pEvent = await _pEventRepository.FirstOrDefaultAsync(input.Id); return ObjectMapper.Map<CreateOrEditPEventDto>(pEvent); } public async Task CreateOrEdit(CreateOrEditPEventDto input) { if(input.Id == null){ await Create(input); } else{ await Update(input); } } [AbpAuthorize(AppPermissions.Pages_Procurement_Create)] private async Task Create(CreateOrEditPEventDto input) { var pEvent = ObjectMapper.Map<PEvent>(input); if (AbpSession.TenantId != null) { pEvent.TenantId = (int) AbpSession.TenantId; } await _pEventRepository.InsertAsync(pEvent); } [AbpAuthorize(AppPermissions.Pages_Procurement_Edit)] private async Task Update(CreateOrEditPEventDto input) { var pEvent = await _pEventRepository.FirstOrDefaultAsync((int)input.Id); ObjectMapper.Map(input, pEvent); } [AbpAuthorize(AppPermissions.Pages_Procurement_Delete)] public async Task Delete(EntityDto<int> input) { await _pEventRepository.DeleteAsync(input.Id); } } }
-
0
Well, you're not returning.
public async Task<PEventDto> CreateOrEdit(CreateOrEditPEventDto input) { if (input.Id == null) { return await Create(input); } else { return await Update(input); } } private async Task<PEventDto> Create(CreateOrEditPEventDto input) { var pEvent = ObjectMapper.Map<PEvent>(input); if (AbpSession.TenantId.HasValue) { pEvent.TenantId = AbpSession.TenantId.Value; } await _pEventRepository.InsertAsync(pEvent); return ObjectMapper.Map<PEventDto>(pEvent); } private async Task<PEventDto> Update(CreateOrEditPEventDto input) { var pEvent = await _pEventRepository.FirstOrDefaultAsync(input.Id.Value); ObjectMapper.Map(input, pEvent); // ... }
-
0
Hi Aaron thanks for the support.
Finally I can get a response when I create a record but the id field seems a bit odd. I am getting a negative number close to but not exactly int.MinValue . I think this is the temp id before record is saved to the db. İs this the expected behaviour?
-
0
Oh, you should inject IUnitOfWorkManager and call SaveChanges before mapping:
private async Task<PEventDto> Create(CreateOrEditPEventDto input) { // ... await _pEventRepository.InsertAsync(pEvent); await _unitOfWorkManager.Current.SaveChangesAsync(); return ObjectMapper.Map<PEventDto>(pEvent); }