1

Gibt es eine einfache Möglichkeit, sicherzustellen, dass nur neu geschriebene URLs einen Controller aufrufen können?Verwendung von umgeschriebenen URLs im Vergleich zum direkten Controller-Aufruf

Wenn zum Beispiel eine URL www.somesite.com/about auf die Aktion "About" im Controller "Shared" zeigt, kann sichergestellt werden, dass alle Anfragen an www.somesite.com/shared/about enden an der umgeschriebenen URL, in diesem Fall www.somsite.com/about?

Mit anderen Worten, der Benutzer sollte nicht in der Lage sein, einfach/controller/action einzugeben, ohne auf die umgeschriebene URL umgeleitet zu werden.

Wir wollen jedoch nicht aktiv prüfen und umleiten, aber hatten auf eine eingebaute Funktion von MVC gehofft. Die einzigen Vorschläge, die ich in diesen Zeilen fand, waren ChildActionOnly und HttpPost Attribute, aber sie scheinen nicht die Antwort zu sein (normale Links funktionieren nicht).

Wie bereits erwähnt, wir suchen nach etwas einfach, mehr oder weniger eingebaut - wenn es nicht dann sollte es so sein, nicht vorhanden ist ...

Antwort

1

Die integrierte Möglichkeit der Sperrung Strecken zu bedienen IgnoreRoute. Es kürzt das Routing und lässt den Pfad immer einen 404 nicht gefunden werfen.

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     // Ignore /Home/About 
     routes.IgnoreRoute("Home/About"); 

     // Register /About 
     routes.MapRoute(
      name: "About", 
      url: "About", 
      defaults: new { controller = "Home", action = "About" } 
     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

Beachten Sie, dass unter der Decke, die StopRoutingHandler verwendet, die (als Ersatz für MvcRouteHandler) in einem beliebigen benutzerdefinierten Route oder RouteBase implementation verwendet werden können dynamischere ignorieren Regeln als dies zu machen.

HINWEIS: Es ist äußerst wichtig, dass IgnoreRoute vor der Route registriert wird Sie in der Routentabelle ignoriert werden sollen.

+0

Gute Antwort. Allerdings, wenn Sie diese Art von Sache viel tun, können Sie besser bedient werden, indem Sie stattdessen Attribut-Routing verwenden. Auf diese Weise passen Sie die Route für jede Aktion exakt so an, wie Sie es möchten. –

+0

genau das, was wir uns erhofft hatten, danke! – devlock

+0

@Chris Pratt: Wäre es nicht ein Problem, wenn mehrere neu geschriebene URLs dieselbe Controller-Aktion aufrufen (z. B. lokalisierte URLs)? – devlock