2012-04-04 19 views
7

Estoy bien con ~/mapeo a Home Index, y con ~/Blog mapping a Blog Index, pero ¿cómo evito ~/Home mapping también a Home Index? No quiero que las rutas sean accesibles desde más de un solo punto final.Enrutamiento ASP.NET MVC 3: ¿evita ~/acceso a casa?

De forma similar, ¿cómo evito que todas las demás acciones de "Índice" sean accesibles desde ~/Controller y ~/Controller/Index?

OK ~/
NO ~/Inicio
NO ~/Home/Índice
OK ~/AnyOtherController
NO ~/AnyOtherController/Índice

supongo que la regla debería ser algo así como la prevención de cualquier defecto las acciones para ser accesibles de forma explícita, y en el caso del hogar también evitan que sea accesible solo con el controlador.

se puede hacer esto? ¿Ha sido hecho en el pasado? SO, por ejemplo, no hace esto (puede acceder a here o there) y ambos renderizan la página de inicio; y probablemente tengan un nombre de acción predeterminado diferente de "índice", que posiblemente sea también una ruta accesible.

+0

Esto es muy similar a una pregunta que hice el otro día: http://stackoverflow.com/questions/9974402/301-redirect-original-url-request-to-routed-url.No digo que sea un duplicado porque creo que es ligeramente diferente, pero me gustaría saber la respuesta a esto también. – Curt

+0

Tengo curiosidad sobre por qué no quieres que las rutas sean accesibles desde más de un punto final. –

+0

tal vez analice el uso del paquete 'AttributeRouting' de nuget para que pueda definir explícitamente todas sus rutas ... – dotjoe

Respuesta

4

la implementó como esto a fin de que esas rutas para ser considerados como errores 404, pero aún dentro de mi aplicación MVC (a fin de que los errores personalizados ver a tener lugar):

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

Esto sí permite el acceso a Acción Inicio/Índice a través del uso de /home/{id}, pero estoy dispuesto a vivir con eso.

+0

Gracias por publicar lo que terminaste usando. –

4

Simplemente puede declarar que el enrutamiento no se debe aplicar a las URL que coincidan con sus patrones. Por ejemplo:

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

Una URL que coincida con estas rutas a continuación, sería tratado como una página desnuda, que por supuesto no existirá.

+1

Seguramente no quiere ignorar todas las demás acciones de ** Inicio ** además de ** Índice **, por lo que la primera debe cambiarse a '" Inicio ". –

0

Así es como pude lograr lo que creo que preguntas.

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

puedo acceder a

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

pero el acceso no está disponible para

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

Espero que esta ayuda :)

Cuestiones relacionadas