以下のコントローラーを考えると
public class MyController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Test()
{
return RedirectToRoute(new { action = "Index" });
}
}
そしてこのルーティング
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Route1",
"Route1",
new {controller = "Account", action = "Index"});
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
My/Test を参照すると、MyController の Test Action が期待どおりにヒットします。次に、RedirectToRoute
アクションを「インデックス」として指定したため、結果は Route1 を使用します。また、コントローラーを指定しなかったため、デフォルトで「アカウント」になります。これにより、AccountController の Index アクションが期待どおりにヒットします。
ルーティングを以下のコードに変更すると、動作が異なり、期待どおりに動作しません。My/Test を参照すると、HomeController の Index アクションではなく、MyController の Index アクションにリダイレクトされます。
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
が使用されると、MVC は現在のコントローラーを推測するのでRedirectToAction
、これは MyController のインデックス アクションにリダイレクトされますが、MVC ソースのコード コメントはRedirectToRoute
現在のコントローラーを推測しないと述べています。
なぜこれが起こっているのか誰にも分かりますか?