MVC 4 fangen, die alle route nie erreicht
Wenn Sie versuchen, zu erstellen eine catch-all-route in MVC 4 (etwas, was ich gefunden habe mehrere Beispiele, und basiert mein code auf) es gibt einen 404-Fehler. Ich bin mit dieser auf IIS 7.5. Dies scheint wie eine unkomplizierte Lösung, so was bin ich?
Einen Hinweis, wenn ich bewegen Sie die "CatchAll" - route über die "Default" - route funktioniert es. Aber natürlich dann keine anderen Controller werden nie erreicht.
Hier ist der code:
Route.Config:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"CatchAll",
"{*dynamicRoute}",
new { controller = "CatchAll", action = "ChoosePage" }
);
Controller:
public class CatchAllController : Controller
{
public ActionResult ChoosePage(string dynamicRoute)
{
ViewBag.Path = dynamicRoute;
return View();
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da das eigentliche Ziel der Schaffung der catchall route war in der Lage sein zu handhaben, dynamische urls und ich war nicht in der Lage zu finden, eine direkte Antwort auf die ursprüngliche Frage oben, näherte ich mich meiner Forschung aus einer anderen Perspektive. Dabei stieß ich auf diesen blog-post: Benutzerdefinierte 404, wenn keine passende route vorhanden ist
Diese Lösung ermöglicht die Bearbeitung von mehreren Abschnitten innerhalb einer bestimmten url
(d.h. http://www.mysite.com/this/is/a/dynamic/route)
Hier ist das Letzte benutzerdefinierte controller-code:
var dynamicRoute = string.Join("/", requestContext.RouteData.Values.Values);
Es ist wahrscheinlich, weil, was auch immer Ihre route testen sind diese mit passenden 1. - Standard-route. Die Art und Weise das routing in MVC arbeitet, jeder Adresse, die Sie übergeben, wird versucht, eine übereinstimmung mit Routen in Routen Auflistung in der Reihenfolge des Auftretens. Sobald es findet die 1. übereinstimmende route bricht die weitere Ausführung. In diesem Fall ist die Default-route 1. in der Liste so, wenn es abgestimmt ist Ihre zweite route wird nie untersucht werden.
Im Grunde so etwas schreiben http://www.mysite.com/Home/Testing/Item/Page in Ihre Adressleiste und dies sollte nicht überein, um Ihre Default-route, und versuchen Sie dann entsprechend die CatchAll route.
Versuchen zu definieren, die optional string dynamicRoute parameter auf der route: