2012-04-04 6 views
7

Sto bene con ~/mappatura a Home Index, e con ~/Blog mapping a Blog Index, ma come faccio a impedire la mappatura di ~/Home anche a Home Index? Non voglio che le rotte siano accessibili da più di un singolo endpoint.Instradamento ASP.NET MVC 3: impedisce l'accesso ~/home?

Analogamente, come impedire che ogni altra azione "Indice" sia accessibile da ~/Controller e ~/Controller/Indice?

OK ~/
NO ~/Casa
NO ~/Home/Indice
OK ~/AnyOtherController
NO ~/AnyOtherController/Indice

Credo che la regola dovrebbe essere qualcosa come prevenire ogni difetto le azioni devono essere esplicitamente accessibili e, nel caso di casa, impediscono anche che sia accessibile solo con il controllore.

Questo può essere fatto? È stato fatto in passato? SO ad esempio non lo fa (puoi accedere a here o there) ed eseguire il rendering della home page; e probabilmente hanno un nome di azione predefinito diverso da "index", che probabilmente è probabilmente anche un percorso accessibile.

+0

Questo è molto simile a un domanda che ho posto l'altro giorno: http://stackoverflow.com/questions/9974402/301-redirect-original-url-request-to-routed-url.Non sto dicendo che sia un duplicato perché penso che sia leggermente diverso, ma sarei interessato a conoscere la risposta anche a questo. – Curt

+0

Sono curioso di sapere perché non vuoi che i percorsi siano accessibili da più di un endpoint. –

+0

forse considerare di usare il pacchetto 'AttributeRouting' da NuGet in modo da poter definire in modo esplicito tutti i percorsi ... – dotjoe

risposta

4

attuato in questo modo in modo che quelle rotte per essere considerati come errori 404, ma ancora all'interno della mia applicazione MVC (in modo che gli errori di visualizzazione personalizzata che si terrà):

/// <summary> 
    /// By not using .IgnoreRoute I avoid IIS taking over my custom error handling engine. 
    /// </summary> 
    internal static void RegisterRouteIgnores(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "IgnoreHome", 
      "Home", 
      new { controller = "Error", action = "NotFound" } 
     ); 

     routes.MapRoute(
      "IgnoreIndex", 
      "{controllerName}/Index/{*pathInfo}", 
      new { controller = "Error", action = "NotFound" } 
     ); 

Questo non consentono l'accesso ai Home/Index action attraverso l'uso di /home/{id}, ma sono disposto a conviverci.

+0

Grazie per aver postato ciò che hai finito usando. –

4

È possibile semplicemente dichiarare che il routing non deve essere applicato agli URL che corrispondono a tali modelli. Ad esempio:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.Ignore("Home/{*pathInfo}"); 
    routes.Ignore("{controller}/Index"); 
} 

Un URL corrispondente queste rotte verrebbe quindi trattata come una pagina nudo, che ovviamente non esisterà.

+1

Sicuramente non vuole ignorare tutte le altre ** azioni ** di casa oltre a ** Indice **, quindi il primo deve essere cambiato in '" Home "'. –

0

Questo è il modo in cui sono stato in grado di ottenere quello che penso che tu stia chiedendo.

// Portal Sections 
     routes.MapRoute("Home", 
         "", 
         new { controller = "Home", action = "Index" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("About", 
         "about", 
         new { controller = "Home", action = "About" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("Features", 
         "features", 
         new { controller = "Home", action = "Features" }, 
         new[] { "Myapp.Portal.Controllers" }); 


     routes.MapRoute("Help", 
         "help", 
         new { controller = "Help", action = "Index" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("Knowledgebase", 
         "help/kb", 
         new { controller = "Help", action = "Knowledgebase" }, 
         new[] { "Myapp.Portal.Controllers" }); 

posso accedere

  • mysite.com
  • mysite.com/about
  • mysite.com/features
  • mysite.com/help
  • mysite.com/ help/kb

ma l'accesso non è disponibile per

  • mysite.com/home/about
  • mysite.com/home/features

Spero che questo aiuto :)