2012-05-23 41 views
8

我正在嘗試創建一些自定義地圖路線,但無法讓它工作得很正確。自定義MapRoute

我的最終目標是能夠指定如下內容。在哪裏我基本上有我的網址構建的價值對「ID」和「名稱」。這個名字是無關緊要的,僅僅爲了用戶的喜好,我會在我的控制器中要求這個ID。

/儀表板/ 5-MY-村名/ 89-MY-羣名/ 133-也許偶數另一個亞羣

對於我工作的第一部分首發並有麻煩。

瀏覽到的「http://本地主機:53933 /儀表板/ 109建設-XYZ」,而使用以下路線生成錯誤A public action method '109-building-xyz' was not found on controller 'MyInterfaceInterface.Controllers.DashboardsController'.

routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 

很顯然,我希望這個被路由到索引功能帶參數。

我在做什麼錯?我是否正確地構造了這個?我來自web-PHP背景,並使用htaccess來實現這樣的事情。

謝謝

+1

您是在默認路由之後還是在此之前添加此路由? – Chris

+0

我認爲你只能使用正斜槓分開參數(但可能會誤解此)。如果短劃線被接受爲分隔符,那麼很可能您需要在ID後包含短劃線,以使路由起作用。另外,正如Chris所暗示的,路線排序很重要。我建議使用NuGet來安裝RouteDebugger包(並在Web.config中啓用它)。它可以讓你輕鬆找出任何給定URL匹配的路線。 –

回答

9

路線的順序很重要。 MVC將匹配第一個聲明的路由和匹配URL模式的模式。

所以,如果你有這樣的:

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", // URL pattern 
    new { controller = "Home", action = "Index" }, 
    new { id = UrlParameter.Optional } 
); 
routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 

然後將與URL http://localhost:53933/dashboards/109-building-xyz是MVC將匹配「儀表板」控制器和「109建設-XYZ」的行動發生什麼。

你需要總是首先宣佈你的最具體的路線,更普遍的路線後,如下所示:

routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 
routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", // URL pattern 
    new { controller = "Home", action = "Index" }, 
    new { id = UrlParameter.Optional } 
); 

然而,莫滕Mertner是正確的,他的評論 - 我不認爲你可以有2路由參數不能以正斜槓分隔。您需要將您的網址格式更改爲類似以下內容以便將其與默認路由引擎一起使用:

"dashboards/{id}/{name}"