0

Wie kann ich das clientseitige Routing umgehen, wenn ich außerhalb der im Router festgelegten Routenliste navigieren möchte?Multiple SPA Verwenden von MVC-Bereichen - Navigieren außerhalb von SPA Router-Routen

Ich habe ein Projekt mit Durandal.js erstellt und SPA in verschiedenen Bereichen erstellt. Das Problem, auf das ich gestoßen bin, ist, wenn ich außerhalb des aktuellen SPA und in einen anderen navigieren oder zurück zur Homepage der gesamten Anwendung, die überhaupt kein SPA ist, sondern einfach eine cshtml-Seite sagen soll.

Was ich versucht habe, ist Durandals mapUnknownRoutes-Handler abzufangen und dann window.location.href zu verwenden, um heraus zu navigieren. Das funktioniert, aber wenn ich auf die Homepage der Anwendung ("/") gehe, stimmt der Router mit dem "root" des SPA überein und navigiert nicht auf die Homepage, sondern stattdessen auf die Root-Route des SPA.

Die Gegend Route in diesem Beispiel "/ spaHome" -Route, deren MVC wie folgt aussieht:

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

Hier ist, was ich habe die Durandal Router einzurichten getan:

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" }); 

Alle Hinweise oder führt in die richtige Richtung dafür würde sehr geschätzt werden!

Antwort

0

Nach etwas Versuch und Irrtum war ich in der Lage, eine Lösung zu finden, was ich versuchte, zu erreichen. Es sieht wie eine feste Lösung aus, hoffentlich verursacht es keine Probleme auf der Straße.

Ich habe das Routen-Array geändert und die Standardroute von der ersten Route entfernt. Dies erlaubte mir, eine unbekannte Route zu haben, um die normale MVC-Homepage zu erreichen. Ich musste auch die Eigenschaft "root" aus der Aktivierungsfunktion des Routers entfernen. Das bedeutete wiederum, dass ich die Routen im Route-Array explizit mit dem zusätzlichen Bereichsteil oder der URL deklarieren musste ("spaHome /").

Dann in meinem mapUnknownRoutes-Handler habe ich die Route für den Bereich Teil der URL überprüft, und wenn das existierte, habe ich den SPA-Router verwendet, um eine nicht gefundene Seite für dieses SPA anzuzeigen. Sonst habe ich angenommen, dass die Route außerhalb des Gebiets existiert und ich muss mit window.location.href zur URL navigieren.

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 }); 

Wenn jemand eine bessere Lösung hat, lass es mich wissen!


EDIT

Ok, ich lief in ein Problem mit der Geschichte, während dies zu tun. Ich musste der Durandal router.js-Datei eine Zeile hinzufügen, um zu verhindern, dass die vorherige Route zur Verlaufs-Warteschlange hinzugefügt wurde.

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

bearbeiten 2

Ich lief auch in ein Problem mit dieser Methode, wo die Navigation nicht ganz richtig für IE9 und unten funktioniert.