2012-08-17 62 views
0

這是我的第一個ASP MVC項目,所以我不知道如何做到這一點。如何在ASP中路由此MVC

我有一個名爲Admin的部分,它有一個管理控制器。我使用這只是一個索引頁面。

在管理部分,有不同的部分。比方說,公司和行當

我要處理那些在自己CompanyController和LineOfBusinessController

一切我想要的路線與聯繫,雖然即前綴。管理員/公司,管理/企業/添加

我已經是這個

routes.MapRoute(
      name: "Admin", 
      url: "Admin/{controller}/{action}/{id}", 
      defaults: new { controller = "Admin", action = "Index", id = UrlParameter.Optional } 
     ); 

的問題是,現在我所有的路線選擇這一項在默認情況下,意在默認路徑之前添加路由實現這個一切都變成管理員/科即管理員/首頁等.....

我試過使用Html.RouteLink而不是ActionLink和URL的格式正確,但是當我去管理/公司它找不到它假設公司在AdminController

如何正確地路由此?

編輯

這裏是我的路線,然後我的鏈接

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

     routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "Admin", 
      url: "Admin/{controller}/{action}/{id}", 
      defaults: new { controller = "Admin", action = "Index", id = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     );    
    } 

鏈接

<li>@Html.ActionLink("Home", "Index", new { controller = "Home" }, ViewBag.SelectedNav == "Home" ? new { @class = "active" } : null)</li> 

鏈路結束/管理/主頁

UPDATE

在這裏沒有標記答案,因爲我最終探索並最終使用了Areas。這是在一個答案中提出的,但其餘的答案是不正確的,所以我不想誤導任何人。感謝區域的建議,但是

回答

0

具有您的具體路線下的通用路由。路由定義的順序很重要。當MVC找到一個請求的匹配路由時,它不會處理其餘的。

routes.MapRoute(
      name: "Admin", 
      url: "Admin/{controller}/{action}/{id}", 
      defaults: new { controller = "Admin", action = "Index", 
               id = UrlParameter.Optional } 
     ); 

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

而且最好是你在這種情況下使用地區。這是一個更好的方法,當你想structure你的應用程序在不同的部分,如管理員/普通用戶等。

+0

我確實已經這樣做了,但是其他路由選擇了Admin路由而不是通用路由...我認爲這只是以這種方式工作,但它不是 – Dexterity 2012-08-17 14:25:39

+0

你能顯示一個錯誤的鏈接 – Shyju 2012-08-17 14:26:54

+0

你有那個鏈接嗎?放置在一些視圖屬於你的管理區域? – Shyju 2012-08-17 14:28:52

0

因爲我不知道鏈接行爲應該是什麼,我可以建議的最好的事情是調試你的路線,看看哪條路線正在處理哪個網址。

1)進入到Visual Studio和安裝RouteDebugger

PM>安裝,包裝routedebugger

2)一些代碼添加到您的全局文件

protected void Application_Start(object sender, EventArgs e) 
{ 
    RegisterRoutes(RouteTable.Routes); 
    RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes); 
} 

3)運行您的網站並請求您可疑的鏈接。

4)查看結果並修改相應


編輯:看來好像RouteDebugger v2現在RouteMagic

PM>安裝,包裝RouteMagic

,你可以找到github的源代碼

+0

我已經安裝routedebugger ....它不會爲我這樣工作。也許因爲我在VS2012上使用MVC 4? RouteDebug只有: DebugHttpHandler,DebugRoute,DebugRouteHandler,PreApplicationStart和RouteDebuggerHttpModule ....沒有RouteDebugger屬性 – Dexterity 2012-08-17 15:11:39

+0

可能要使用DebugRoute。 Phil的博客文章有點老,並且已經有Nuget Package的更新... – 2012-08-17 15:20:48

+0

我該如何編寫一個等價的RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);使用DebugRoute?編輯:nvm它自動執行它 – Dexterity 2012-08-17 15:25:15