У меня есть таблица с 1 или несколькими записями, которая отображается пользователю. Пользователь выбирает один или несколько флажков и отправляет, когда форма отправляется, данные обновляются в базе данных. В этот момент я из кода вызываю location.relaod (); Для того, чтобы перезагрузить страницу и отобразить правильные данные.
Вот код из backend web api:
[HttpGet]
public async Task<object> Get()
{
var entries = await _entryRepository.GetEntriesByUserIdAsync(await GetUserId());
var result = _mapper.Map<IEnumerable<Entries>, IEnumerable<EntryReponse>>(entries);
return Ok(result);
}
Вот код службы, которая вызывает веб-API:
import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions } from '@angular/http';
import 'rxjs/add/operator/map';
import { AuthService } from "./auth.service";
import { Entry } from "../models/entry";
import { Observable } from 'rxjs/Rx';
@Injectable()
export class EntryService
{
private readonly API_URL = 'http://localhost:52841/api/entry/';
constructor(private http: Http,
private authService: AuthService) { }
createEntry(id) {
let headers = new Headers();
headers.append('Authorization', "Bearer " + this.authService.token);
let options = new RequestOptions({ headers: headers });
return this.http.post(this.API_URL + id, null,options);
}
get() {
let headers = new Headers();
headers.append('Authorization', "Bearer " + this.authService.token);
let options = new RequestOptions({ headers: headers });
return this.http.get(this.API_URL, options).map(res => res.json());
}
update(entry: Entry){
let headers = new Headers();
headers.append('Authorization', "Bearer " + this.authService.token);
let options = new RequestOptions({ headers: headers });
return this.http.put(this.API_URL, entry, options);
}
Вот код компонента:
import { Component, OnInit } from '@angular/core';
import { EntryService } from "../../services/entry.service";
import { MasterCodeService } from "../../services/masterCode.service";
import { SubCodeService } from "../../services/subcode.service";
import { Entry } from "../../models/entry";
import { MasterCode } from "../../models/masterCodes";
@Component({
selector: 'entry-list',
templateUrl: './entry-list.component.html'
})
export class EntryListComponent implements OnInit {
private readonly PAGE_SIZE = 100;
query: any = {
pageSize: this.PAGE_SIZE
};
masterCodes: any = [];
subCodes: any = [];
masterCode: MasterCode = new MasterCode();
entries: Entry[];
entry: Entry = {
id: [],
masterCodeId: 0,
subCodeId: 0,
accepted: 0,
rejected:0
};
columns = [
{ title: "#" },
{ title: "PO" },
{ title: "SKU" },
{ title: "Status" }
];
constructor(private entryService: EntryService,
private masterCodeService: MasterCodeService,
private subCodeService: SubCodeService) {
}
load() {
this.masterCodeService.getMasterCodes(this.query).subscribe(res => {
this.masterCodes = res;
});
this.entryService.get().subscribe(res => {
this.entries = res;
});
}
ngOnInit() {
this.load();
}
onChange(event) {
var selectedMasterCode = this.masterCodes.items.find(x => x.id == event.target.value);
this.entry.masterCodeId = selectedMasterCode.id;
this.subCodeService
.getSubCodes()
.subscribe(res => this.subCodes = res.filter(x=>x.masterCode.id == selectedMasterCode.id));
}
submit(event) {
if (event.target["noError"]) {
this.entry.accepted = 0;
this.entry.rejected = 0;
}
if (event.target["accepted"] && event.target["accepted"].checked === true ) {
this.entry.accepted = 1;
this.entry.rejected = 0;
}
if (event.target["rejected"] && event.target["rejected"].checked === true ) {
this.entry.accepted = 0;
this.entry.rejected = 1;
}
this.entryService.update(this.entry).subscribe(x => {
location.reload();
this.load();
});
}
selectSubCode(event) {
this.entry.subCodeId = event.target.value;
}
onEntryToggle(entryId, $event) {
if ($event.target.checked)
this.entry.id.push(entryId);
else {
var index = this.entry.id.indexOf(entryId);
this.entry.id.splice(index, 1);
}
}
}
После вызова отправки я получаю следующую ошибку:
An unhandled exception occurred while processing the request. JsonReaderException: Unexpected character encountered while parsing value: {. Path 'errorMessage', line 1, position 17. Newtonsoft.Json.JsonTextReader.ReadStringValue(ReadType readType)
Stack Query Cookies Headers JsonReaderException: Unexpected character encountered while parsing value: {. Path 'errorMessage', line 1, position 17. Newtonsoft.Json.JsonTextReader.ReadStringValue(ReadType readType) Newtonsoft.Json.JsonTextReader.ReadAsString() Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, bool hasConverter) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, string id) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue) Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, bool checkAdditionalContent) Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) Newtonsoft.Json.JsonConvert.DeserializeObject(string value, Type type, JsonSerializerSettings settings) Newtonsoft.Json.JsonConvert.DeserializeObject(string value, JsonSerializerSettings settings) Microsoft.AspNetCore.NodeServices.HostingModels.HttpNodeInstance+d__7.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNetCore.NodeServices.HostingModels.OutOfProcessNodeInstance+d__13.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNetCore.NodeServices.NodeServicesImpl+d__10.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNetCore.NodeServices.NodeServicesImpl+d__10.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNetCore.SpaServices.Prerendering.PrerenderTagHelper+d__29.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner+d__0.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) AspNetCore._Views_Home_Index_cshtml+d__12.MoveNext() in Index.cshtml
Подскажите, пожалуйста, как я могу это исправить? P.S. Та же ошибка, которую я получаю, если я не отправляю форму, просто нажимаю F5, чтобы перезагрузить страницу.
Обновлять
Вот JSON при первом вызове:


То, что я понял, для перезагрузки некоторых URL-путей работает, а для некоторых из них не работает. Напомним, некоторые из маршрутов можно вызывать вручную, введенными в браузер, а некоторые из них только по ссылкам, почему? Как я могу понять, где ошибка, если все ссылки, все компоненты, все сервисы созданы одинаково? С уважением, Даниэль
У меня есть вопрос об обновлении. Чтобы добавить, я поставил точку останова на бэкэнд, когда вызываю GET. При первом вызове он работает, если я пытаюсь перезагрузить страницу, GET вообще не вызывает.
К сожалению, вместо того, что вы добавили, можете ли вы вместо этого проверить сетевую панель и добавить фактический JSON, который отправляется на ваш сервер? Это должен быть один из запросов, которые не выполняются.
Теперь все в порядке?
Как я вижу, разница в заголовке, при перезагрузке он не вызывает правильный URI.
Почему вы используете «старый» и «устаревший» http?
Я не думаю, что "старый" http создает проблему или он создает?





Я исправил код
load() {
this.entryService.get().subscribe(res => {
this.entries = res;
},err=>console.info(err));
this.masterCodeService.getMasterCodes(this.query).subscribe(res => {
this.masterCodes = res;
});
}
это было решением для меня, и я хотел бы знать, как это мне поможет и почему я должен добавить err => console.info (err), не знаю. Был бы признателен, если бы кто-нибудь мог прояснить мне это.
** Я ошибся, решение было в app.shared.ts В конфигурации маршрутизации я добавил canActive
{путь: 'записи', компонент: EntryListComponent, canActivate: [AuthGuard]},
Поскольку API авторизован, это обязательно. **
Не могли бы вы показать нам JSON, который он пытается проанализировать?