忽略包含值的路由

时间:2017-10-03 01:21:20

标签: c# angular asp.net-core url-routing

我对未本地化的路由有一个全能,但是,这会在刷新页面时中断Angular:

routes.MapRoute(
    name: "default",
    template: "{culture:lang}/{controller=Home}/{action=Index}/{id?}");

routes.MapGet("{*path}", ctx =>
{
    object path = ctx.GetRouteValue("path") ?? string.Empty;
    string culturedPath = $"/en/{path}";
    ctx.Response.Redirect(culturedPath);
    return Task.CompletedTask;
});

routes.MapSpaFallbackRoute(
    name: "spa-fallback",
    defaults: new { culture = "en", controller = "Home", action = "Index" });

如果我撤销MapGetMapSpaFallbackRoute的订单,则整个应用程序会中断,因为/会无限制地映射到回退路由。

有没有办法可以更改{*path}(或其代码),以便在文化已经存在时它不会映射到那个?当然,我可以检查path是否已经具有这种文化,但这并不能解决如何处理"不能处理"网址。

我的目标是:

  • / => /en/Home/Index(MVC,有效)
  • /en/home/login => HomeControllerLogin(MVC,有效)
  • /en => HomeControllerIndex(MVC,有效,正确加载Angular)
  • /en/profile => ProfileComponent(Angular,休息)

1 个答案:

答案 0 :(得分:0)

我找到了一个简单的答案:添加一个与文化相匹配但不是controller / action的路线,并将其重定向到HomeControllerIndex

routes.MapRoute(
    name: "default",
    template: "{culture:lang}/{controller=Home}/{action=Index}/{id?}");

routes.MapRoute(
    name: "forAngular",
    template: "{culture:lang}/{*path}",
    defaults: new { controller = "Home", action = "Index" }); // Contains the Angular app

routes.MapGet("{*path}", ctx =>
{
    object path = ctx.GetRouteValue("path") ?? string.Empty;
    string culturedPath = $"/en/{path}";
    ctx.Response.Redirect(culturedPath);
    return Task.CompletedTask;
});