我正在使用TypeScript应用程序开发Aurelia CLI v0.32,RequireJS。我的应用程序有几个路由,其中一些有参数。问题是外部引用者可能会重定向到大写的路线或参数。
我想要的是我的所有路线 - 或更好地说:网址 - 以小写显示。为此,如果需要,我也愿意转换所有params
值。
路由定义的示例,其中:company
和:orderid
是字符串:
{ route: ':company/:orderid', name: 'order-detail', moduleId: ... etc }
实际请求可能是:
http://localhost:9000/ACME/ABC-123-42
预期的行为是浏览器网址小写为:
http://localhost:9000/acme/abc-123-42
注意:如果您熟悉C#/ ASP.NET MVC,您会注意到我实际上在寻找以下行为:
services.AddRouting(options => options.LowercaseUrls = true);
我无法在Aurelia文档中找到与此相关的任何内容,特别是the RouterConfiguration。四处寻找,我确实找到了一种感觉有点hacky的方式。但也许我在这里正确的轨道上我将PreActivateStep
添加到routerconfig:
private configureRouter(config: RouterConfiguration, router: Router): void {
config.title = 'My LowerCaseUrl App';
config.options.pushState = true;
config.addPreActivateStep(EnforceLowerCaseUrls);
config.map(Routes.maps());
this.router = router;
}
这是感觉hacky的部分的实现:
import { NavigationInstruction, Next, activationStrategy } from 'aurelia-router';
export class EnforceLowerCaseUrls {
public async run(nav: NavigationInstruction, next: Next): Promise<any> {
console.log('nav: ', nav);
if (nav.params) {
// lowercase the 'framgment' alone doesn't seem to be enough
nav.fragment = nav.fragment.toLowerCase();
// *replace* the params with all lowercase values
this.convertAllPropertiesToLowerCase(nav.params);
// the router has a navigateToRoute, which allows me to replace the url
// inspiration: https://stackoverflow.com/questions/39244796/aurelia-router-modify-route-params-and-address-bar-from-vm-with-router
nav.router.navigateToRoute(
nav.config.name,
nav.params,
{ trigger: false, replace: true }
);
}
return next();
}
private convertAllPropertiesToLowerCase(o: any) {
// hacky attempt to convert the values of an object to lowercase
Object.keys(o).forEach((k) => {
if (o[k])
o[k] = o[k].toLowerCase();
});
}
}
现在它部分工作了。在主要路线/ companyid /它工作。但随着更深的路线,这会打破。我确信通过一些工作,我可以让它运行起来。但在我进一步深入研究之前,我的问题是:
nav.*
是否有特定属性? 或者我在这里完全走错路? 感谢。
更新:马修的答案似乎有效!
答案 0 :(得分:2)
import { NavigationInstruction, Next, activationStrategy, Redirect } from 'aurelia-router';
export class EnforceLowerCaseUrls {
public async run(nav: NavigationInstruction, next: Next): Promise<any> {
if (/[A-Z]/.test(nav.fragment)) {
return next.cancel(new Redirect(nav.fragment.toLowerCase()));
} else {
return next();
}
}
}