2013-02-18 97 views
1

我設法讓我的家庭控制器只使用操作名稱來訪問它,但只要我添加另一個控制器並嘗試通過在我的Home路由聲明中添加另一個路由聲明來執行相同的操作,所有路由默認爲Home控制器。MVC路由 - 我想在URL中沒有控制器的多個{action}/{id}路由

routes.MapRoute("HomeTest", "{action}/{id}", new { controller = "Home", action = "TestHome", id = UrlParameter.Optional }); 
routes.MapRoute("TestTest", "{action}/{id}", new { controller = "Test", action = "Test", id = UrlParameter.Optional }); 


public class HomeController : Controller 
{ 
    public ActionResult TestHome(int? id) 
    { 
     return View(); 
    } 
} 

public class TestController : Controller 
{ 
    public ActionResult Test(int? id) 
    { 
     return View(); 
    } 
} 

有沒有什麼辦法可以訪問兩個控制器,而不在url中包含控制器名稱?

我也有默認路線,如果這有什麼區別。它在這兩條路線下。

回答

3

航線MVC中添加的順序進行比較。對於您的代碼示例,這意味着所有請求將首先與「HomeTest」路線進行比較,因此任何匹配都將遵循該路線。 「TestTest」路由具有完全相同的格式,這意味着它將永遠不會被使用,因爲任何匹配都已經使用了「HomeTest」路由。如果您希望在不使用控制器名稱的情況下訪問控制器的操作,則路由中必須有一些內容來告訴它要使用哪個控制器。這並不一定是實際控制人名稱 - 你可以這樣做:

routes.MapRoute("TestTest", "keyWord/{action}/{id}", new { controller = "Test", action = "Test", id = UrlParameter.Optional }); 
routes.MapRoute("UsersTest", "otherKeyWord/{action}/{id}", new { controller = "Users", action = "Test", id = UrlParameter.Optional }); 

其中的關鍵字基本上充當別名隱藏你的控制器名稱。你甚至可以更進一步,並掩蓋你的動作名稱爲好,這可以讓你使用多個控制器下一個URL根:

routes.MapRoute("TestTest", "test/key1/{id}", new { controller = "Test", action = "Test", id = UrlParameter.Optional }); 
routes.MapRoute("UsersTest", "test/key2/{id}", new { controller = "Users", action = "Test", id = UrlParameter.Optional }); 

做這樣的事情可以讓你給你的用戶一個更爲整潔,URL結構幫助他們瀏覽您的網站,並瞭解鏈接將會帶到哪裏(可能也很方便收藏書籤),但這確實意味着您必須手動定義您的網址,這更加有效。

2

通過定義url模式的方式,路由引擎將始終將與模式{action}/{id}匹配的所有操作重定向到Home控制器。

你要買什麼大概是這樣的:

routes.MapRoute("HomeTest", "testhome/{id}", new { controller = "Home", action = "TestHome", id = UrlParameter.Optional }); 
routes.MapRoute("TestTest", "test/{id}", new { controller = "Test", action = "Test", id = UrlParameter.Optional });