2012-04-04 17 views
7

Mam się dobrze z ~/mapowaniem do indeksu głównego i mapowaniem ~/blogów do indeksu bloga, ale jak mogę również zapobiec mapowaniu ~/home do indeksu głównego? Nie chcę, aby trasy były dostępne z więcej niż jednego punktu końcowego.Routing ASP.NET MVC 3: zapobiec dostępowi ~/do domu?

Podobnie w jaki sposób zapobiec dostępowi do każdej innej akcji "Indeks" zarówno z ~/kontrolera, jak i ~/kontrolera/indeksu?

OK ~/
NO ~/Home
NO ~/Home/Index
OK ~/AnyOtherController
NO ~/AnyOtherController/Index

Chyba regułą powinno być coś jak zapobieganie wszelkim domyślne działania są dostępne jawnie, aw przypadku domu także uniemożliwiają dostęp do niego tylko za pomocą kontrolera.

Czy to można zrobić? Czy zrobiono to w przeszłości? SO na przykład nie robi tego (możesz uzyskać dostęp do here lub there) i oba renderują stronę główną; i prawdopodobnie mają inną domyślną nazwę akcji niż "index", co prawdopodobnie jest również dostępną trasą.

+0

ta jest bardzo podobna do Pytanie, które zadałem temu innemu dniu: http://stackoverflow.com/questions/9974402/301-redirect-original-url-request-to-routed-url.Nie mówię, że jest to duplikat, ponieważ uważam, że jest nieco inny, ale byłbym zainteresowany poznaniem odpowiedzi na to pytanie. – Curt

+0

Jestem ciekaw, dlaczego nie chcesz, aby trasy były dostępne z więcej niż jednego punktu końcowego. –

+0

Może zajrzyj do pakietu 'AttributeRouting' z nuget, abyś mógł jednoznacznie zdefiniować wszystkie trasy ... – dotjoe

Odpowiedz

4

wprowadziły go w ten sposób, aby na tych trasach należy traktować jako 404 błędów, ale nadal w mojej aplikacji MVC (w celu wyświetlenia błędy niestandardowe nastąpić):

/// <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" } 
     ); 

ta zezwala na dostęp do Strona główna/Czynność indeksu dzięki użyciu /home/{id}, ale jestem gotów z tym żyć.

+0

Dzięki za publikację tego, z czego skorzystałeś. –

4

Możesz po prostu oświadczyć, że routing nie powinien być stosowany do adresów URL pasujących do wzorców. Na przykład:

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

Adres URL pasujący do tych tras będzie traktowany jako odsłonięta strona, która oczywiście nie będzie istnieć.

+1

Z pewnością nie chce ignorować wszystkich innych akcji ** Home ** oprócz ** Index **, więc pierwszy musi zostać zmieniony na '" Home "'. –

0

W ten sposób udało mi się osiągnąć to, o czym myślę, że pytasz.

// 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" }); 

mogę dostęp

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

ale dostęp nie jest dostępna do

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

nadzieję, że ta pomoc :)