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 CmsRouteConstraint
true
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?
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
@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) –
Ich bekomme es jetzt. Danke für die Erklärung. – getsetcode