鉴于以下控制器
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,因为我已将Action指定为“Index”。由于我没有指定控制器,因此默认为“帐户”。这会按预期点击AccountController的索引操作
如果我将路由更改为下面的代码,那么它的工作方式不同,而不是我期望的。当我浏览My / Test时,这会重定向到MyController的Index Action而不是HomeController的Index Action。
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
我知道当使用RedirectToAction
时,MVC将推断当前的控制器,因此这将重定向到MyController的索引操作,但MVC源中的代码注释说RedirectToRoute
不会推断当前的控制器和我希望通过第一个例子证明这一点。
有人知道为什么会这样吗?
答案 0 :(得分:2)
当前请求值始终使用。 Url.Action
和Url.RouteUrl
(由RedirectToRoute
使用)之间的区别在于Url.Action
会使用当前值覆盖controller
和action
的空值请求值(在MVC中永远不为null),而Url.RouteUrl
不会(它将它们保留为null)。请注意,null值与不存在的,ommited或未定义的值不同。
查看this post我写的关于路由的信息:
UrlHelper.Action方法集采用actionName和controllerName 字符串参数。调用这些方法可以转换为 相当于
Url.RouteUrl(new { action = actionName, controller = controllerName })
的东西。正如我们之前在中验证的那样无法使用 null或空字符串,用于默认值,不带参数,使用null for actionName和/或controllerName可能导致无法匹配 期望的路线。因此,Url.Action使用当前请求 每当null用于actionName时,控制器和操作值 和/或controllerName。
<小时/> 为了澄清,第一个示例匹配Route1,因为:
在第二个示例中,My用作控制器的值,取自当前请求值,因为路由包含控制器令牌并且未提供值。