2010-07-28 31 views
1

具體而言,默認的目錄命名結構是[控制器]/[ActionMethod]導致像www.mysite.com/home/actionMethodName渲染網址。我將如何配置global.config以允許MVC2中的actionMethod根路徑?

如果我想簡單地意味着控制器(在這個例子中,「家」),這樣我就可以得到一個URL,看起來像這樣:www.mysite.com/actionMethodName。

我還沒有看到這種配置的許多要求。我可以看到它如何打破慣例,但我會想象有很多人需要根路徑。

回答

2

因爲你打算刪除網址的{控制器}元素,你可能需要獲得更具體一點與其他的網址,如:

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

當路由表進行詢問,如果使用的網址如www.mysite.com/Account,它會匹配第一條路由,因爲我們已經詳細說明了用於匹配url的模式。如果我們然後執行類似www.mysite.com/DoSomething的操作,它將使用我們上次選擇的默認路由,嘗試調用HomeController類型的DoSomething操作。

我注意到的一點是,很多MVC開發者似乎認爲url是嚴格的{something}/{something}/{something},而它基本上可以是任何你喜歡的東西,例如,我可以有一條路線:www.mysite.com/my-weird-and-wonderful-url我可以專門映射:

routes.MapRoute("Somewhere", "my-weird-and-wonderful-url", new { controller = "Whatever", action = "Whenever" }); 

希望有所幫助。

+0

感謝馬修 - 工作得很好。提供了他們的見解 - 我很高興迅速提供了一個解決方案。 – Neurothustra 2010-07-28 15:44:04

2

易蘋果派 - 你只需指定自己的路線! =)

一個例子:

routes.MapRoute(
    "RootPathing", 
    "{action}", 
    new { controller = "Default", action = "Index" }); 

這將註冊映入的所有路徑的路徑,並嘗試將其與對應於該路徑的動作名稱映射到DefaultController。但是,請注意,如果您將包含默認路由上面的這條路線,你將不能夠比DefaultController達成任何其他控制器 - 因此,把這個路徑下面鏈中的缺省路由。然後它將被與控制器名稱不匹配的所有路徑匹配。 調試路線時,Phil Haack's Routing Debugger真的值得一看。

+0

我沒有時間,現在證實這一點,但我敢肯定的是作爲URL將被默認路由相匹配,這將失敗(這幾乎一切比賽),如果你有這條路線之上。這會拋出一個異常,說它找不到控制器。相反,您可以在此之前添加更具體的路線,以確保它們不匹配此路線應匹配的路徑。 – 2010-07-28 14:49:44

+0

@Mattias:那可能是真的。我現在也不能測試它,但是這種情況下的解決方案是爲每個控制器添加一個特定的路由,使用「HomeController」的''〜/ Home/{action}''等模式,所以它是很容易修復。這是一個你無法避免的問題 - 如果你想能夠在路徑路徑上選擇一個動作,你不能在任何路線上過於通用;這是路由概念的限制,而不是MVC框架的限制。 – 2010-07-28 14:56:25

+0

@Tomas Lycken,當然可以。你也可以實現自己的路由類,並檢查url是否是有效的動作,然後在路由列表中首先添加。但是在這種情況下,它可能更適合以前編寫更具體的路線。 – 2010-07-28 15:00:44