2010-08-19 130 views
0

我目前的路由規則ASP.NET MVC路由,需要幫助建立航線

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

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

我也只能由管理員可以訪問多個控制器。目前我有一個菜單在:

/Admin/Index 

其中列出了一堆的行動鏈接。現在點擊任何這些鏈接重定向這樣的例子:

/News/Index 

但我需要它是這樣的:

/Admin/News/Index 

該電流設置排序的作品,但在我的主頁鏈接被抓錯誤的規則和要去,例如/管理員/ Article/1當他們應該只是/文章/ 1

我已經搜索了StackOverflow的答案,並發現一些接近 - 但我還是不'理解足夠的路由以利用他們的答案。任何援助表示讚賞。

編輯

下面是從主頁鏈接的集合,它是由路由規則陷入錯誤

<div id="menucontainer"> 

       <ul id="menu">    
        <li><%: Html.ActionLink(" ", "About", "Home", null, new { ID = "AboutMHN" })%></li> 
        <li><%: Html.ActionLink(" ", "Products", "Home", null, new { ID = "Products" })%></li> 
        <li><%: Html.ActionLink(" ", "HubLocator", "Home", null, new { ID = "HubLocator" })%></li> 
        <li><%: Html.ActionLink(" ", "ResellerProgram", "Home", null, new { ID = "ResellerProgram" })%></li> 
        <li><%: Html.ActionLink(" ", "ResellerLogin", "Home", null, new { ID = "ResellerLogin" })%></li> 
        <li><%: Html.ActionLink(" ", "ContactUs", "Home", null, new { ID = "ContactUs" })%></li> 
       </ul>     

      </div> 

而且,我的管理控制器只是有一個索引行動。我擁有所有其他「管理」頁面的控制器,例如,我的NewsController具有索引,創建,編輯,刪除,列出所有新聞文章以及執行crud操作的操作。我是否錯誤地構造了這個?

我AdminController.cs

[Authorize(Roles = "Administrator")] 
    public class AdminController : Controller 
    { 
     // 
     // GET: /Admin/ 

     public ActionResult Index() 
     { 
      return View(); 
     } 


    } 

管理員/指標這將返回包含就像

<li><%: Html.ActionLink("News Articles", "Index", "News") %></li> 

我NewsController.cs具有進行CRUD操作動作與ActionLinks的菜單。我想網址是

Admin/News/Edit/5 

而不是

News/Edit/5 

回答

0

我需要使用區域。

參見:http://elegantcode.com/2010/03/13/asp-net-mvc-2-areas/

我創建了一個名爲管理新的領域,改名我AdminController.cs到MenuController.cs並放置所有必需的控制器和視圖的管理區域文件夾內。內部管理區域文件夾中有一個名爲AdminAreaRegistration.cs包含

public class AdminAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "Admin"; 
     } 
    } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Admin_default", 
      "Admin/{controller}/{action}/{id}", 
      new { controller= "Menu", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

我不得不在控制器=「菜單」添加這樣,當你瀏覽到/管理它會帶你到/管理/菜單文件/索引默認。現在區域文件夾中的任何控制器都可以像/ Admin/News/Edit/5等那樣訪問。感謝您的嘗試,我應該更清楚地知道我是絕對的MVC noob,並且不知道有關區域。

+0

我瞭解地區的方式,我不認爲你做得對。我認爲你的動作鏈接不正確。您應該使用路線鏈接並指定路線名稱。 – Martin 2010-08-19 21:02:04

0

翻轉兩個:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

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

如果不工作,添加代碼的新聞菜單鏈接你的問題。

+0

是的我猜管理規則太'貪婪'了?它通過這種方式獲取我主頁上的所有鏈接。 – Gallen 2010-08-19 19:14:17

0

該映射是從上到下,可以應用的第一條路線將被使用。在你的情況下,你有默認的管理路線。由於可以使用Default,因此您應該將Admin路由放置在Default之上。問題在於所有人都將使用該路線。你需要更具體一些,或許你應該刪除{controller},這樣只有Admin動作纔會使用該路由。需要更多信息才能更好地提供建議。

+0

我更新了我的問題,並提供了更多關於我正在嘗試做什麼的信息。 – Gallen 2010-08-19 19:18:14