2017-06-05 3 views
0

I mit Routing definiert eine neue ASP.NET-Core-Web-Anwendung haben, wie folgt:ASP.NET Core-Route mit Einschränkung nicht fällt zurück auf Standardroute

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "sitemap", 
     defaults: new { controller = "Sitemap", action = "Index" }, 
     template: "sitemap.xml"); 

    routes.MapRoute(
     name: "cms", 
     template: "{*permalink}", 
     defaults: new { controller = "Content", action = "Index" }, 
     constraints: new { permalink = new CmsRouteConstraint() }); 

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

Wenn ich die URL anfordern / Ich sehe meine Heimat Seite serviert von HomeController. Wenn ich die URL /sitemap.xml anfordere, sehe ich das XML, das von SitemapController gedient wird. Wenn ich eine URL anfordere, für die meine Match Methode in CmsRouteConstrainttrue zurückgibt, sehe ich die Anforderung, die von ContentController gehandhabt wird.

Alle anderen URLs geben jedoch eine 404-Antwort zurück. Nach meinem Verständnis sollten diese URLs immer noch von meiner Standardroute verarbeitet und an HomeController übergeben werden, aber sie sind nicht. Was ich merkwürdig finde ist, dass unabhängig davon, ob ich URL / oder /where/am/i anfordern kann ich CmsRouteConstraint beide false Rückkehr sehen, also warum würde der ehemalige am Ende von HomeController behandelt werden und nicht letzteres?

Antwort

1

Sie müssen verwenden, was Sie haben. Für exaple wenn Sie anrufen möchten /yolo/swag wird es von deafult Route behandelt werden, aber Sie nicht yolo Controller mit swag Aktion haben und kehrt 404

auch über * in cms Route und seine allumfassende Routenfunktion erinnern so reccoment ich verwende " greedy matching "am Ende der Route Tabelle

+0

Nicht 100% sicher, dass ich Ihren Standpunkt verstehe./yolo/swag würde von der Standardroute behandelt, die Home als Standardcontroller und Index als Standardaktion angibt. Also sollte HomeController, nicht 404 übergeben werden. Und re. gierige Übereinstimmung, der Plan ist für diese Route, alle Anfragen zu fangen, überprüfen Sie eine Bedingung, die, falls falsch, Anfrage an die nächste Route in der Routentabelle weitergibt. Es gibt Fälle, in denen ich die 404-Antwort möchte, aber jetzt muss ich verstehen, warum '/' HomeController durchgeht, aber 'anything/else' nicht. – getsetcode

+1

@TomTrougon Troughton Sie verstehen nicht, wie Routing in ASP.NET Core MVC funktioniert. '{controller = Home}' bedeutet, dass der Controller genommen wird, oder wenn er leer ist, setzen Sie 'Home'. '/ yolo/swag' verwendet' yolo' Controller, nicht taubult 'Home' (aber mit' téhalult' route name) –

+0

Ich bekomme es jetzt. Danke für die Erklärung. – getsetcode

Verwandte Themen