2017-09-22 1 views
1

Ich habe die folgende Route in meinem MVC-Projekt ein:MVC Routing Werfen 404

  routes.MapRoute(
       "Product", 
       "product-{pathname}-{productId}", 
       new { controller = "Product", action = "ProductPage" }); 

Dies funktioniert gut für Urls wie product-test-title-1234 aber wenn die pathname Bit der URL product- enthält, wird eine 404 geworfen - Ist gibt es eine Möglichkeit, eine URL wie product-test-product-title-1234 zu ermöglichen?

Weirdly, wenn ich das zweite Produkt setzen kurz vor der Produkt-ID (zB product-test-title-product-12345), dann die Route funktioniert und die Seite angezeigt wird, irgendwo anders, und es wirft ein 404

aktualisieren

Ich denke, das Problem könnte darin liegen, dass 2 Teile der URL mit der Route übereinstimmen. Ich denke, meine Frage ist, wie Sie sicherstellen, dass die Route besagt, dass das erste Produkt am Anfang der URL stehen muss (und weitere Instanzen zählen) Produkt als Teil des Pfadnamens).

Nach weiteren Tests hat ich, dass statt gefunden Produkt Controller zu gehen, diese URL zu meinem catchall Weg geht: {*pathname} - nicht sicher, warum dies

+0

Warum ein '-' (Bindestrich)? - anstatt 'product/{pathname}/{productId}' zu erzeugen '../ product/test/product-title-1234' –

+0

@StephenMuecke ist es leider der Pfad der aktuellen Webseite und wir müssen es gleich behalten damit wir keine 301 bleibenden Karten für alle alten URLs implementieren müssen (sonst wird die neue Seite die alte ersetzen, werden wir auf seo bestraft). Es ist auch, was die Marketingabteilung will - ich würde für die übliche '/' Struktur zu gehen, aber anscheinend eine flache URL-Struktur ist auch besser für Seo-Rankings – Pete

Antwort

0

Gibt es eine Möglichkeit für eine URL zu ermöglichen, geschieht wie Produkt-Test-Produkt-Titel-1234?

Ja, aber die Route URL Sie definiert haben, enthält 3 Striche und die URL Sie sind passende enthält 4. Sie können diese URL übereinstimmen mit so etwas wie:

 routes.MapRoute(
      "Product", 
      "product-{pathname}-product-{productId}", 
      new { controller = "Product", action = "ProductPage" }); 

aber das ist wahrscheinlich nicht das, was du suchst nach. Das Problem hier ist, dass wenn Sie - als Trennzeichen zwischen Ihren Route Platzhaltern verwenden, Sie den Platzhalter selbst nicht enthalten - oder die Route-Klasse wird verwirrt.

Aber Routing ist sehr flexibel, wenn Sie auf eine niedrigere Ebene fallen und erben RouteBase, die wahrscheinlich mehr nach dem was Sie suchen. Sie können dann die von Ihnen gewünschten benutzerdefinierten Logik/URLs in die Route einfügen, wodurch Sie ein altes URL-Schema genau zuordnen können, auch wenn es nicht sehr gut organisiert ist.

See: Multiple levels in MVC custom routing

+0

Hallo Nightowl, danke für die Antwort, leider würde dies nicht funktionieren, wie es nicht tut Löse wirklich nichts - der Pfad, der Produkt neben der Produkt-ID hat, funktioniert bereits (siehe letzten Satz der Frage oben) und ich möchte keinen zweiten Pfadnamen hinzufügen (dh ich möchte keine Route wie 'Produkt- { pfadname} -product- {pfadname1} - {productId} ') da ich das gesamte Pfadnamen-Bit benötige, um die Seitendaten von einem kopflosen cms-System zu erhalten – Pete

+0

Siehe den Link, den ich zur Verfügung gestellt habe, wenn er auf ein CMS-System gehen soll. Die Verwendung von 'MapRoute' funktioniert nicht in jedem Szenario, aber wenn Sie' RouteBase' erben, können Sie Ihre Routen buchstäblich so programmieren, dass sie funktionieren. – NightOwl888