【发布时间】:2017-08-12 08:14:25
【问题描述】:
我有以下路由表:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "UserRoute",
url: "{username}",
defaults: new { controller = "User", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
所以,当我们有类似:http://mysite/abcde 的 url 时,它会调用 UserController,action Index,如果我们有类似:http://mysite/dashboard/Index 的 url,它会调用 DashboardController,action Index。好的。但是当我尝试调用以下内容时:
return RedirectToAction("Index", "Dashboard");
它调用UserController,带有用户名参数的操作索引等于“仪表板”。为什么以及如何解决?
【问题讨论】:
-
你
UserRoute匹配任何只有一个段的内容(你的RedirectToAction()生成,因为默认操作是Index) -
@StephenMuecke 是对的。您想用
userRoute实现什么目标?默认情况下,如果没有通过任何操作,所有控制器都会重定向到索引操作...正确吗? -
在我看来,您需要创建一个自定义路由约束,仅当且仅当存在该名称的用户时才匹配您的第一条路由的
{username}部分。即便如此,如果用户决定称自己为Home,您仍然会遇到麻烦......这个问题的核心是UserRoute的路径如此贪婪。也许User/{username}可能是一条更可行的路线,不会踩到你的第二条路线的脚趾? -
我绝对应该有mysite/abcde,而不是mysite/User/abcde。当我调用 return RedirectToAction("Index", "Dashboard"); 时如何说 ASP.NET MVC 生成路径“/Dashboard/Index” ?
-
@OlegSh 想想你要什么。这意味着任何编写新控制器的人都需要知道存在哪些用户,并且不允许用户拥有与控制器名称匹配的用户名。太糟糕了。好好想想这件事。这将是一种痛苦。会很痛的。
标签: c# asp.net-mvc asp.net-mvc-4 routing routes