ASP.NET MVC路由行为中的明显不一致

时间:2012-08-02 14:01:07

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

鉴于以下控制器

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不会推断当前的控制器和我希望通过第一个例子证明这一点。

有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

当前请求值始终使用。 Url.ActionUrl.RouteUrl(由RedirectToRoute使用)之间的区别在于Url.Action会使用当前值覆盖controlleraction的空值请求值(在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,因为:

  1. 路线没有令牌,这意味着它不需要匹配值。
  2. 操作值与默认值匹配。
  3. 代码不为控制器提供值。如果提供了值,则需要“帐户”才能匹配。
  4. 在第二个示例中,My用作控制器的值,取自当前请求值,因为路由包含控制器令牌并且未提供值。