2010-11-09 6 views
0

Je veux avoir un contrôleur pour tous les sites urls par exemple:Un contrôleur pour toute application ASP.NET MVC

  • www.mysite.com/page1
  • www.mysite.com/another
  • www.mysite.com/third/some-text
  • www.mysite.com/fourth/some/some/some/some

urls seront créés manuellement, également URL peut être de « ev ery type "(théoriquement vous devez avoir la possibilité de tout mettre en url) Je ne veux pas mettre de nom de contrôleur ou quoi que ce soit (nom de l'action ou id) dans l'url. Comment écrire une règle d'itinéraire url pour cela?

Je ne suis pas intéressé par les inconvénients d'un tel design. Ce est par défaut ASP.NET MVC règle de routage

routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 
+3

Je suis intéressé - pourquoi voulez-vous seulement avoir un contrôleur? – UpTheCreek

Répondre

1

Je ne vais pas vous dire que c'est un mauvais plan. Mais il est. Quoi qu'il en soit, si vous n'avez pas besoin de gérer une profondeur de dossier url illimité, l'astuce consiste à tourner les choses dans l'ordre inverse:

 //maps virtual redirects 
     routes.MapRoute("virtual redirects", 
         "{redirect}", 
         new 
         { 
          area = "", 
          controller = "Content", 
          action = "VirtualRedirect" 
         } 
      ); 

     routes.MapRoute("two level", 
         "{firstPart}/{secondPart}", 
         new 
         { 
          area = "", 
          controller = "Content", 
          action = "PageUrl", 
          thirdPart = "" 
         } 
         ); 

     //maps general content pages 
     routes.MapRoute("page catcher", 
         "{firstPart}/{secondPart}/{thirdPart}", 
         new 
         { 
          area = "", 
          controller = "Content", 
          action = "PageUrl" 
         } 
      ); 

Notez que vous aurez envie de mettre des routes plus spécifiques au-dessus de cela et vous toujours besoin d'une route par défaut déclarée après cela pour que certaines parties de MVC fonctionnent.

1

Je pense que vous pouvez le faire de cette façon, tout simplement passer outre routHandler

 routes.MapRoute(
      "dbroute", 
      "{controller}/{action}/{id}", 
      new { id = "" } 
      ).RouteHandler = new MyRouteHandler(); 

et vous nouveau gestionnaire d'itinéraire comme celui-ci

public class MyRouteHandler : IRouteHandler 
{ 

    #region IRouteHandler Members 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     IRouteHandler handler = new MvcRouteHandler(); 
     var vals = requestContext.RouteData.Values; 
     if (vals["controller"] != null && 
     (vals["controller"].ToString() == "page1" || 
     vals["controller"].ToString() == "another" || 
     vals["controller"].ToString() == "others")) 
     { 

      vals["controller"] = "Test";// your controller; 
      vals["action"] = "Index";//your action 
     } 
     return handler.GetHttpHandler(requestContext); 
    } 


    #endregion 
} 
0

igor,

moins qu'il y ait une raison vraiment convaincante pour faire Donc, je pense à d'autres façons de présenter les URL que vous voulez et de penser à la fonctionnalité discrète «sous les couvertures» que chaque unité logique effectue. une question similaire a été posée un dos while que je répondais à:

What is the advantage of using multiple Controller classes in ASP.NET MVC?

pourrait vous donner quelques idées.

Questions connexes