2010-10-20 28 views
2

鑑於這些路線:爲什麼RedirectToRoute(「默認」)不重定向到根?

routes.MapRoute("Test", "test", new { controller = "Test", action = "Index" }); 
routes.MapRoute("Default", "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

如果我叫RedirectToRoute(「違約」),從它重定向到/test的的TestController的指標作用,但我希望它重定向到/

我檢查的結果在調試會話期間返回之前調用RedirectToRoute(「Default」)。

RedirectToRouteResult result = RedirectToRoute(「Default」);

它有一個屬性RouteName,其值爲「Default」,屬性RouteValues沒有元素(Count = 0)。我使用Reflector進行檢查,並將null作爲RouteValueDictionary在內部傳遞。

同樣,我期望給定在我的應用程序中定義的路由的默認值,它將重定向到HomeController上的索引視圖。

爲什麼不重定向到/

+0

是/ test測試您的應用程序根目錄嗎?或'/'是? – abatishchev 2010-10-20 15:38:46

+0

'/'是我的應用程序 – 2010-10-20 17:52:23

回答

6

填入當前操作的RouteValueDictionary正被用於填寫Controller,Action,ID。這通常是您想要的功能,可以讓您執行諸如<%:Html.ActionLink("MyAction")%>之類的操作,而無需在視圖中指定控制器。

要強制其完整的回落默認只需使用:

RedirectToRoute("default", null");

第二個參數是您routevalues,並通過指定它,你重寫先前存在的值。

然而,我會說首選的方法是有一個家庭路線,不會採取任何參數。這意味着你的重定向不需要大量的空值,並且RedirectToRoute("Home")的調用也很好用。

編輯

這是一個非常古老的答案,一對夫婦的人提到似乎並沒有一直在努力爲他們。對於什麼是值得我現在不使用這種模式,並明確地重寫控制器和區域,當我需要爆發。它不僅顯然工作得更好,而且當你回到代碼中時,很明顯地看到你是從這個上下文中走出來的,並且意味着消除某些路由值。

爲了記錄,我還傾向於基於基於約定的代中基於命名路由的URL生成。

+0

這似乎不適用於區域。 :( – 2016-02-08 11:37:26

2

不看實際的代碼,看看發生了什麼,可能有點棘手知道爲什麼,但這forum職位確實闡明瞭一些光。回答者表示,在封面下可能會創建一個RouteValueDictionary,其中包含您當前所在的控制器和操作,在您的情況下,它將是Test的控制器和Index的操作。然後,在調用RedirectToRoute("Default")時,匹配默認路由時將使用控制器和RouteValueDictionary中的操作,並且您將轉到Test控制器中的Index操作。

現在你可以隨時做一個Redirect("/")帶你到你的網站的主頁。

+1

重定向(「/」)將重定向到域根目錄。如果您的網站位於該網域的子目錄中,則會出現問題。 – Nyatra 2016-08-08 18:37:10

2

我不認爲Chao提到的「null」參數對我有用。也許它在之前的MVC版本中,但現在在MVC 5.2中,這是我可以使其工作的唯一方式:

RedirectToRoute("Default", new { controller = "", action = "" });