2010-11-09 118 views
0

我想爲所有的網站一個控制器的URL 如:一個控制器,用於整個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

網址將被手動創建,也URL可以是的「EV類型「(teoretically你必須有posibility把所有的url) 我不想把控制器名稱或任何東西(動作名稱或ID)在URL中。

如何爲此編寫url路由規則?我沒有這種設計的缺點。 這是默認的ASP.NET MVC路由規則

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

我很感興趣 - 你爲什麼只想要一個控制器? – UpTheCreek 2010-11-09 20:18:41

回答

1

我不會告訴你這是個不錯的計劃。但它是。總之,如果你不需要處理無限URL文件夾深度,關鍵是要以相反的順序運行的東西:

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

注意,你會希望把更多的具體路線上面這一點,你會仍然需要在此之後爲MVC的某些部分工作而聲明的默認路由。

1

我認爲你可以做到這樣,只是重寫routHandler

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

和你的新路由處理這樣

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 
} 
相關問題