【问题标题】:ASP.NET MVC routing taskASP.NET MVC 路由任务
【发布时间】: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


【解决方案1】:

您的路由是正确的(至少对于您提供的 URL)。但是您没有正确调用重定向。

当您生成传出路由时,它不匹配 URL,它匹配传递的 路由值。您的 UserRoute 包含 3 个路由值:

  • 用户名
  • 控制器
  • 动作

所以,为了根据这个路由生成一个 URL(或重定向),你需要传递所有 3 个参数。

return RedirectToAction("Index", "Dashboard", new { username = "Fred" });

也就是说,如果路由值在当前请求中,MVC 将自动重用。因此,如果您的路由已经有一个username 值(例如,您已经在 URL /Fred),它将能够匹配路由而无需明确指定路由值。

return RedirectToAction("Index", "Dashboard");

【讨论】:

  • 但我不想传递不必要的参数:)
  • 该参数不是不必要的,它是必需的,因为你的URL签名中有它。但是你可以通过其他方式通过它。也许this 更符合您的目标?
  • 参数对于动作来说是不必要的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多