使用 MVC 区域的多个 SPA - 在 SPA 路由器路由之外导航

Multiple SPA Using MVC Areas - Navigate Outside SPA Router Routes

当我想在路由器中设置的路由设置列表之外导航时,如何逃避客户端路由?

我使用 Durandal.js 创建了一个项目,并在不同的区域内创建了 SPA。我 运行 遇到的问题是,当我想导航到当前 SPA 之外并进入另一个或说回到整个应用程序的主页时,它根本不是 SPA,而只是一个 cshtml 页面。

我尝试做的是使用 Du运行dal 的 mapUnknownRoutes 处理程序进行拦截,然后使用 window.location.href 导航出去。这行得通,但是当我想转到应用程序的主页(“/”)时,路由器匹配 SPA 的 "root" 并且不会导航到主页,而是导航到 SPA 的根路由。

此示例中的区域路由是“/spaHome”,其 MVC 路由如下所示:

context.MapRoute(
           "spaHome_default",
           "spaHome/{*catchall}",
           new { controller = "Home", action = "Index", id = UrlParameter.Optional }
       );

以下是我设置 Du运行dal 路由器所做的工作:

var routes = [
    { route: ['spaHome', ''], moduleId: 'spaHome', title: "spaHome", hash: "#spaHome"},
    { route: 'one/anotherPage', moduleId: 'one/anotherPage', title: "one/anotherPage", hash: "#one/anotherPage"}
];

router.makeRelative({ moduleId: 'viewmodels' });

router.map(routes)
      .mapUnknownRoutes(function (instruction) {
          utils.navigateToPath(instruction.fragment);
          return false;
      })
      .activate({ pushState: true, root: "/spaHome" });

任何指向正确方向的指示或线索将不胜感激!

经过反复试验,我想出了一个解决方案来解决我想要完成的事情。它看起来像是一个可靠的解决方案,所以希望它不会在未来造成任何问题。

我更改了路由数组并从第一条路由中删除了默认路由“”。当我想访问普通的 MVC 主页时,这让我有一条未知的路线可以离开。我还必须从路由器的激活功能中删除 "root" 属性。这反过来意味着我必须在路由数组中使用额外区域部分或 URL ("spaHome/").

显式声明路由

然后在我的 mapUnknownRoutes 处理程序中,我检查了 URL 区域部分的路由,如果存在,我使用 SPA 路由器显示该 SPA 的未找到页面。否则我假设该路线存在于该区域之外,我需要使用 window.location.href.

硬导航到 URL
var routes = [
    { route: ['spaHome'], moduleId: 'spaHome', title: "spaHome", hash: "#spaHome"},
    { route: 'spaHome/one/anotherPage', moduleId: 'one/anotherPage', title: "one/anotherPage", hash: "#spaHome/one/anotherPage"}
];

router.makeRelative({ moduleId: 'viewmodels' });

router.map(routes)
  .mapUnknownRoutes(function (instruction) {
      if (instruction.fragment.toLowerCase().indexOf("spaHome/", 0) === -1) {
            utils.navigateToPath(instruction.fragment);
      } else {
            var notfoundRoute = "notfound";
            instruction.config.moduleId = notfoundRoute;
            history.navigate(notfoundRoute, { trigger: false, replace: true });
      }
  })
  .activate({ pushState: true });

如果谁有更好的解决方案请告诉我!


编辑

好的,我 运行 在执行此操作时遇到了历史问题。我必须在 Du运行dal router.js 文件中添加一行,以阻止将之前的路由添加到历史队列中。

 if (!instruction.cancelQueue) {
                router.trigger('router:route:before-config', instruction.config, router);
                router.trigger('router:route:after-config', instruction.config, router);
                queueInstruction(instruction);
            }

编辑 2

我也 运行 遇到了此方法的问题,即导航在 IE9 及以下版本中不能正常工作。