2009-07-23 55 views
0

我有一個公共網站,它接受一個頁面名稱,然後默認爲一個控制器和動作,頁面名稱作爲唯一標識符來呈現正確的視圖。例如。 http://www.mydomain.com/homepageASP.Net MVC路由問題 - 問號出現在我的鏈接

我也有一個管理員區域,所有CRUD的東西通過管理員的前綴進行訪問。例如。直到最近,我改變了一些http://www.mydomain.com/admin/controller/action

一切都被罰款,而現在,當我到http://www.mydomain.com/homepage鏈接我有這樣的:

<ul id="menu">    
    <li><%= Html.ActionLink("Home", "Details", "WebPage", new { pageName = "homepage" }, null)%></li> 
    <li><%= Html.ActionLink("About", "Details", "WebPage", new { pageName = "homepage" }, null)%></li>      
</ul> 

不再顯示爲http://www.mydomain.com/homepage而是http://www.mydomain.com/Admin/WebPage/Details?pageName=homepage

誰能幫?

這裏是我的Global.asax:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("AdminRoot", 
      "Admin", 
      new { controller = "Admin", action = "Index" } 
      ); 

     routes.MapRoute(
      "LogOn",            // Route name 
      "LogOn",       // URL with parameters 
      new { controller = "Account", action = "LogOn" }, 
      new { action = "LogOn" } 
     ); 

     routes.MapRoute("Account", 
      "Account/{action}", 
      new { controller = "Account", action = "" } 
     ); 

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


     routes.MapRoute(
     "ErrorRoute",            // Route name 
     "Error/Error404",       // URL with parameters 
     new { controller = "Error", action = "Error404" } 
     ); 


     routes.MapRoute("Admin", 
      "Admin/{controller}/{action}/{id}", 
      new { controller = "Admin", action = "Index", id = "" } 
      /*,new { action = "Create|Edit|Delete" }*/ 
      ); 

     routes.MapRoute("EventNewsData", 
      "Admin/{controller}/{action}/{year}/{month}", 
      new { controller = "Admin", action = "Index", year = 0, month = 0 } 
      /*,new { action = "Create|Edit|Delete" }*/ 
      ); 

     routes.MapRoute(
      "Default",            // Route name 
      "{pageName}/{moreInfoID}",       // URL with parameters 
      new { controller = "WebPage", action = "Details", pageName = "homepage", moreInfoID = 0 }, 
      new { action = "Details" } 
      ); 


     routes.MapRoute("Error", "{*url}", new { controller = "Error", action = "Error404" }); 

    } 

UPDATE:這已經固定,但不知道爲什麼

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("AdminRoot", 
      "Admin", 
      new { controller = "Admin", action = "Index" }, 
      new { action = "Index" } 
      ); 

     routes.MapRoute(
      "LogOn",            // Route name 
      "LogOn",       // URL with parameters 
      new { controller = "Account", action = "LogOn" }, 
      new { action = "LogOn" } 
     ); 

     routes.MapRoute("Account", 
      "Account/{action}", 
      new { controller = "Account", action = "" } 
     ); 

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





     routes.MapRoute("Admin", 
      "Admin/{controller}/{action}/{id}", 
      new { controller = "Admin", action = "Index", id = "" } 
      , new { action = "Create|Edit|Delete|Index|DeleteFromIndex" } 
      ); 

     routes.MapRoute("EventNewsData", 
      "Admin/{controller}/{action}/{year}/{month}", 
      new { controller = "Admin", action = "Index", year = 0, month = 0 } 
      , new { action = "GetCalendarData" } 
      ); 

     routes.MapRoute(
      "Default",            // Route name 
      "{pageName}/{moreInfoID}",       // URL with parameters 
      new { controller = "WebPage", action = "Details", pageName = "homepage", moreInfoID = 0 }, 
      new { action = "Details" } 
      ); 

     routes.MapRoute(
     "ErrorRoute",            // Route name 
     "Error/Error404",       // URL with parameters 
     new { controller = "Error", action = "Error404" } 
     ); 

     routes.MapRoute("Error", "{*url}", new { controller = "Error", action = "Error404" }); 

    } 
+3

嘗試使用菲爾Haacked出色的路線調試器(http://haacked.com/archive/2008/03/ 13/url-routing-debugger.aspx),我懷疑你在列表中比你期望的更早匹配。 – Lazarus 2009-07-23 11:55:53

+0

謝謝,剛試過。如果我去http://www.mydomain.com/homepage,這是第一個匹配的路線,但鏈接仍然指向奇怪 – Jon 2009-07-23 12:12:16

回答

2

也許問題出在action = "Details"約束(有沒有「 {pageName}/{moreInfoID}「中的{action}」):

routes.MapRoute(
     "Default",            // Route name 
     "{pageName}/{moreInfoID}",       // URL with parameters 
     new { controller = "WebPage", action = "Details", pageName = "homepage", moreInfoID = 0 }, 
     new { action = "Details" } 
     ); 

更新:

現在你的代碼是使用這條路線:

routes.MapRoute("Admin", 
     "Admin/{controller}/{action}/{id}", 
     new { controller = "Admin", action = "Index", id = "" } 
     /*,new { action = "Create|Edit|Delete" }*/ 
     ); 

但是你可以使用Html.RouteLink代替:

<ul id="menu">    
    <li><%= Html.RouteLink("Home", "Default", new { pageName = "homepage" })%> </li> 
    <li><%= Html.RouteLink("About", "Default", new { pageName = "homepage" })%> </li>      
</ul> 

更新:

ASP。 NET Routing用「Details」操作和「WebPage」控制器查找路由(「pageName」是可選的)並匹配「管理員」路線。

修訂

或之前 「管理」 路由添加這條路線:

routes.MapRoute("TheRoute", 
    "{pageName}/{moreInfoID}", 
    new { controller = "WebPage", action = "Details", moreInfoID = 0 }, 
    new { pageName = "homepage" } 
);