2016-04-26 7 views
1

Ich benutze ASP.NET Core MVC und mit Attribut-Routing in meinen Controllern.ASP.NET MVC Routing fangen alle

In meiner Configure-Methode in Startup.cs rufe ich app.UseMvc() auf, um meine MVC-Anwendung zu starten.

Alles funktioniert wie erwartet.

Jetzt versuche ich eine Catchall gehen, aber die 404 immer das Beste aus der Situation.

änderte ich meine app.UseMvc auf die folgenden:

app.UseMvc(routes => 
{ 
    routes.MapRoute("Default", 
        "{*catchall}", 
        new { controller = "Index", action = "Index" }, 
        new { catchall = @"^(.*)?$" }); 
}); 

aber keine Würfel.

Ich habe sogar versucht, den Catchall regulären Express zu entfernen, aber ich werde immer noch auf meine 404-Seite weitergeleitet.

Jede Hilfe wird geschätzt!

+0

Bestätigen Sie, dass Sie ein 'IndexController' haben mit' Index() 'Aktion – Nkosi

+0

ich.Mein IndexController hat '[Route (" ")]' und es hat eine Methode 'Index()', die wie folgt eingerichtet wird: '[HttpGet] public IActionResult Index() {return View(); } ' – DOMZE

+1

Ich denke, Sie vermischen die Konvention basierte Routing-und Attribut-Routing. Ihr Catch all wird auf Controller angewendet, die kein Attribut-Routing verwenden. Ist dies für einen Web-API-Controller oder MVC-Controller. – Nkosi

Antwort

1

Für alle das gleiche Problem, schob Tom Droste mich in die richtige Richtung

eine herkömmliche Route hinzufügen und Routing subtile Nebenwirkungen unter Verwendung von Attribut Die allumfassende Route zuerst in die Route aufgenommen hat Wörterbuch und die Attribut-Routen werden anschließend hinzugefügt.

Die AttributeRouting-Klasse erstellt nur eine Instanz von AttributeRoute, bei der es sich um einen IRouter handelt, der für das Erstellen der Attributrouten verantwortlich ist. Dies geschieht beim ersten Aufruf von AttributeRoute

Damit wurde der Catchall also nie aufgerufen, weil es nicht der letzte Weg ist. alles wieder in herkömmlichen Routing setzen das Problem behoben.

ich https://luisfsgoncalves.wordpress.com/2015/08/18/asp-net-5-routing-part-ii/ schlage vor, das Lesen zu verstehen, wie Routing-Attribut funktioniert

0

Haben Sie das versucht?

routes.MapRoute(
    "Default", 
    "{*.}", 
    new { controller = "Home", action = "Index" } 
); 
+0

Ja, Das ist das Gleiche wie das Entfernen des regulären Ausdrucks von dem, was ich oben gepostet habe. – DOMZE

0

In Ihrer Startup.cs Datei, legen Sie diese Codezeile direkt über app.UseMvc() in der Konfiguration() Methode. Natürlich können Sie auf die von Ihnen gewünschte Seite umleiten.

app.UseStatusCodePagesWithRedirects("~/Home/Index"); 

EDIT:
Per Sie Kommentar, soweit ich weiß, dann würden Sie haben Ihre eigene Middleware schreiben, um die Original-URL/Abfrageparameter zu umleiten und zu halten. Wenn Sie mit der Entwicklung von Middleware nicht vertraut sind, habe ich ein Demo-Projekt auf GitHub veröffentlicht, das demonstriert, wie Middleware in drei einfachen Schritten entwickelt wird. Sie können das Projekt here herunterladen.

+0

Das funktioniert .. aber wie kann ich die Abfrageparameter behalten und was nicht? mag sagen, ich gehe zu/thispage/doesnot/exist wird es umleiten zu ~/Home/Index, aber ich möchte/thispage/doesnot/in der URL ... – DOMZE

+0

Ich bearbeite meine Antwort. –

+0

Cool sieht interessant aus! werde ich mal schauen. Die Frage, die ich habe, ist, dass warum nicht die Standardroute angewendet wird? – DOMZE

0

Also wenn ich Sie richtig verstehe, wollen Sie nur eine Route, die die sein wird, wenn der Rest nicht übereinstimmt. In meinem Wissen gibt es zwei Möglichkeiten, dies zu beheben. Der richtige wäre, eine Routing-Middleware zu schreiben, aber die schmutzige Lösung besteht darin, eine Route mit allen nullbaren Argumenten zu erstellen, die als letzte gefunden werden.

routes.MapRoute(
    "DirtyRoutingSolution", 
    "{notUsed?}/{notUsedTwo?}/{notUsedThree?}/{notUsedFour?}", 
    new { controller = "Home", action = "Index"} 
); 
+0

Korrekt, ich möchte, dass, wenn eine Route/ABC nicht existiert, dass es lädt/stattdessen aber/ABC in der URL behält. Grundsätzlich sollte jede nicht angepasste Route meinen Standard laden. – DOMZE

+0

Wenn das der Fall ist, ist dies die schnelle und schmutzige Lösung, dies zu tun. Erstelle einfach die Menge von "unbenutzt?" wie deine längste URL ist. Auf diese Weise wird alles erfasst. –

+0

Ich kopierte genau was du oben geschrieben hast, und wenn ich/ABC setze, bringt es mich immer noch auf die 404 Seite ... scheint, dass diese Route nie aufgerufen wird. Wird konventionelles Routing vor dem Attribut-Routing festgelegt? Technisch sollte diese Route die letzte sein, die funktioniert, korrigiere mich, wenn ich falsch liege – DOMZE