#asp.net #angular #angular2-routing
#asp.net #angular #angular2-маршрутизация
Вопрос:
Я разрабатываю приложение Angular 2, которое использует KendoUI datagrid в asp.net веб-приложение. Я установил index.html
в качестве начальной страницы. Когда я нажимаю клавишу F5, index.html
загружается. При нажатии на меню Риски отображается таблица данных с данными, которые определены на risk-list.component.html
странице. Его URL localhost/risks
-адрес. Если я нажму F5, я получу ошибку 404 страница не найдена. Может кто-нибудь сказать мне, в чем может быть проблема и как я могу ее исправить?
Это мой код:
список рисков.Component.ts
import { Component, OnInit } from '@angular/core';
import { Risk } from './risk';
import { RiskService } from './risk.service';
@Component({
moduleId: module.id,
selector: 'rm-risks',
templateUrl: '/app/risk-list.component.html',
providers: [RiskService]
})
export class RiskListComponent implements OnInit {
title = 'Risk List';
risks: Risk[];
constructor(private _riskService: RiskService) {
console.log(this.risks);
}
getRisks(): void {
this._riskService.getRisks().then(risks => this.risks = risks);
}
ngOnInit(): void {
this.getRisks();
}
};
risk-list.component.html
<kendo-grid [data]="risks">
<kendo-grid-column field="reference" title="Reference" width="120">
</kendo-grid-column>
<kendo-grid-column field="insuredName" title="Insured Name">
</kendo-grid-column>
<kendo-grid-column field="inceptionDate" title="Inception Date" width="230">
</kendo-grid-column>
<kendo-grid-column field="riskType" title="Risk Type" width="120">
</kendo-grid-column>
<kendo-grid-column field="Status" title="Status">
</kendo-grid-column>
<kendo-grid-column field="grossPremium" title="Gross Premium" width="230">
</kendo-grid-column>
<kendo-grid-column field="allocatedTo" title="Allocated To" width="120">
</kendo-grid-column>
<kendo-grid-column field="allocatedCompany" title="Allocated Company">
</kendo-grid-column>
<kendo-grid-column field="Discontinued" width="120">
<template kendoCellTemplate let-dataItem>
<input type="checkbox" [checked]="dataItem.Discontinued" disabled />
</template>
</kendo-grid-column>
</kendo-grid>
risk.service.ts
import { Injectable } from '@angular/core';
import { Risk } from './risk';
import { Risks } from './mock-risk';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/from';
@Injectable()
export class RiskService {
getRisks(): Promise<Risk[]> {
return Promise.resolve(Risks);
}
}
risk.ts
export class Risk {
riskId: number;
reference: string;
insuredName: string;
inceptionDate: string;
riskType: string;
status: string;
grossPremium: number;
allocatedTo: string;
allocatedCompany: string;
}
mock-risk.ts
import { Risk } from './risk'
export const Risks: Risk[] = [
{
"riskId": 1,
"reference": "HISC9308336",
"insuredName": "SA 84161",
"inceptionDate": "March 19, 2016",
"riskType": "Quote",
"status": "Indication",
"grossPremium": 100,
"allocatedTo": "Broker User",
"allocatedCompany": "Broker"
},
{
riskId: 2,
reference: "HISC9308337",
insuredName: "SA 84161",
inceptionDate: 'April 22, 2016',
riskType: 'Quote',
status: 'Indication',
grossPremium: 300,
allocatedTo: 'Broker User',
allocatedCompany: 'Broker'
}
];
risks.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { RiskListComponent } from './risk-list.component';
import { RiskService } from './risk.service';
import { RiskRoutingModule } from './risks-routing.module';
import { GridModule } from '@progress/kendo-angular-grid';
@NgModule({
imports: [
CommonModule,
FormsModule,
RiskRoutingModule,
GridModule
],
declarations: [
RiskListComponent
],
providers: [
RiskService
]
})
export class RisksModule { }
риски-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { RiskListComponent } from './risk-list.component';
@NgModule({
imports: [
RouterModule.forChild([
{ path: 'risks', component: RiskListComponent }
])
],
exports: [
RouterModule
]
})
export class RiskRoutingModule { }
app.component.html
<h1>Angular Router</h1>
<nav>
<a routerLink="/risks" routerLinkActive="active">Risks</a>
</nav>
<router-outlet></router-outlet>
app.component.ts
import { Component } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'my-app',
templateUrl:'/app/app.component.html'
})
export class AppComponent { }
app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { RiskListComponent } from './risk-list.component'
import { HomeComponent } from './home.component'
@NgModule({
imports: [
RouterModule.forRoot([
{ path: '', component: HomeComponent }
])
],
exports: [
RouterModule
]
})
export class AppRoutingModule { }
main.ts
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
Ответ №1:
Эта проблема решается путем реализации HashLocationStrategy
, которая добавляет #
ко всем вашим маршрутам. Например, http://localhost/myComponent
становится http://localhost/#/myComponent
. Вы достигаете этого, добавляя HashLocationStrategy
к AppModule
поставщикам:
{ provide: LocationStrategy, useClass: HashLocationStrategy }
Конечно, вам нужно импортировать LocationStrategy
и HashLocationStrategy
из @angular/common
:
import { LocationStrategy, HashLocationStrategy } from '@angular/common';
Для получения дополнительной информации проверьте Angular 2 Router amp; Navigation — Стили URL-адресов браузера.
Комментарии:
1. Ссылка, которой вы поделились, подсказывает мне поместить RouterModule.forRoot(routes, { useHash: true }) // …/#/crisis-center/ в app.module.ts. В моем примере я считаю, что это app-routing.module.ts. Но в моем app-routing.module.ts у меня есть RouterModule.forRoot([ { path: «, component: HomeComponent } ]) Как мне добавить эту строку сюда, поскольку она выдает ошибку компиляции
2. @Tom В вашем случае это должно быть
RouterModule.forRoot([ { path: '', component: HomeComponent } ], { useHash: true })
3. Спасибо, что стратегия хеширования сработала. Я прочитал, что LocationStrategy используется по умолчанию. Если я установлю useHash = false и обновлю браузер, это не сработает.
Ответ №2:
При обновлении браузера он отправит запрос get на сервер с текущим URL-адресом, поскольку angular использует навигацию в стиле HTML 5, URL-адрес не будет иметь смысла для сервера. Либо обновите свой сервер, чтобы обслуживать index.html по определенным путям или используйте HashLocationStrategy
.
Преимущество использования навигации в стиле HTML 5 заключается в том, что вы можете смешивать свое приложение angular со страницами, отображаемыми сервером.
Пример того, как это работает с asp.net : http://blog .johnnyreilly.com/2015/05/a-tale-of-angular-html5mode-aspnet-mvc.html
Больше информации об angular: https://angular.io/docs/ts/latest/guide/router.html #!#стили URL-адресов браузера
Комментарии:
1. Можете ли вы сказать мне, как ее решить, используя мой пример, поскольку я не могу сопоставить ваш пример с моим. В вашем примере выполняются вызовы api
Ответ №3:
Лучший способ избавиться от этой ошибки 404 страница не найдена, вы должны импортировать HashLocationStrategy
в appModule.ts
Когда я ранее работал над Angular, в моем проекте возникала ошибка того же типа, поэтому я создал простой репозиторий для такого рода ошибок (страница 404 не найдена), это может вам помочь. Вот ссылка -> AngularAppExample