asp mvc RedirectToRoute将当前操作添加到重定向

时间:2011-04-15 05:11:44

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

我有一个名为RedirectLogin的控制器,它基本上设置了一个TempData var,以便在登录完成时重定向回来。

在此之后,它只是调用:

return RedirectToRoute("Login");

然而,当它重定向时,它转到/ login / RedirectLogin - 由于某种原因,它正在调用调用操作的名称。我认为应该只返回默认值,而不是添加操作,尤其是不属于目标控制器的操作。

如果我打电话:

return RedirectToRoute("Login", new { action = "Index" });

然后它正确地进行了路径/登录,但是再次,默认情况下不应该这样做,而没有额外的位?

我有一个稍微非标准的路由设置。基本上我正在为我的客户创建虚拟子文件夹,所以www.domain.com/clienturl但我仍然希望www.domain.com/join或www.domain.com/about重定向到非客户端数据。我这样做是通过直接在路径中添加控制器的名称,并在更通用的名为Landing之前添加它。这可能是问题,还是有更好的方法:)

        // Root paths
        routes.MapRoute("About", "about", new { controller = "Home", action = "About" });
        routes.MapRoute("Info", "info", new { controller = "Home", action = "Info" });
        routes.MapRoute("Privacy", "privacy", new { controller = "Home", action = "Privacy" });
        routes.MapRoute("Terms", "terms", new { controller = "Home", action = "Terms" });

        // Root controllers
        routes.MapRoute("Join", "join/{action}/{id}", new { controller = "join", action = "Index", id = UrlParameter.Optional });
        routes.MapRoute("Login", "login/{action}/{id}", new { controller = "login", action = "Index", id = UrlParameter.Optional });
        routes.MapRoute("Account", "account/{action}/{id}", new { controller = "account", action = "Index", id = UrlParameter.Optional });
        routes.MapRoute("Goodbye", "goodbye/{action}/{id}", new { controller = "goodbye", action = "Index", id = UrlParameter.Optional });

        // Organization
        routes.MapRoute("Landing", "{organization}/{controller}/{action}/{id}", new { controller = "Landing", action = "Index", id = UrlParameter.Optional });

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

2 个答案:

答案 0 :(得分:2)

它正在重用当前请求中的数据。因为您有可选参数'action',所以它从当前请求中获取action操作是RedirectLogin并将其附加到url。我会在没有可选参数的情况下为您的登录页面创建一个特定的路由条目,或者重定向到操作而不使用命名路由。 Pro ASP.NET MVC 2中有一个页面可以更详细地解释发生了什么。

答案 1 :(得分:1)

您可能希望尝试的替代方案如下:

RedirectToAction(String, String, RouteValueDictionary);
RedirectToAction(String, RouteValueDictionary);
Redirect("~/login"); // Note, this works but if you move around the urls for your routes you'll need to fix it everytime... not recommended

此处的MSDN文章显示了控制器上的所有可用方法:http://msdn.microsoft.com/en-us/library/system.web.mvc.controller_methods%28v=VS.98%29.aspx

不要为此目的使用RedirectToActionPermanent或RedirectToRoutePermanent ......