【问题标题】:Why is the wrong route being used?为什么使用了错误的路线?
【发布时间】:2011-10-07 22:07:42
【问题描述】:

我正在尝试做 SO 为其问题控制器所做的事情。

  • /Posts/{id}/{title}查看帖子时(操作名称未显示)
  • /Posts/New 当您发布新内容时。
  • /Posts/Delete/10等等……

我设置了两条路线(好吧,如果您不计算默认路线,则一条)。似乎正在发生的是 Post 控制器中的所有动作都通过第一个路由。

那是什么?显然我错了,但我想不通。

routes.MapRoute("ViewPosts",
    "Posts/{postid}/{title}",
    new { controller = "Posts", action = "View", postid = "", title = "" });

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

【问题讨论】:

    标签: c# asp.net-mvc-3 routes


    【解决方案1】:

    第一个路由处理从/Posts开始的所有请求。

    你需要使用约束来允许{postid} 是唯一的数字:

    routes.MapRoute("ViewPosts",
        "Posts/{postid}/{title}",
        new { controller = "Posts", action = "View", postid = "", title = "" },
        new { postid= @"\d+" });
    

    在这种情况下,仅当提供了数字 ID 时,此路由才会处理它,否则“默认”路由将处理。

    【讨论】:

    • /Posts 使用该规则会发生什么,没有其他规则?它仍然会匹配。 (这可能是也可能不是意图)
    • 这条规则仍然有效。约束仅在{postid} 参数上定义。
    • 谢谢,那种工作。 (嗯,没有错误被抛出)。但是,现在 /edit/10 之类的操作正在出现 /edit?id=10
    • 尝试使用RouteLink而不是ActionLink,并直接在其中指定“默认”路由。
    【解决方案2】:

    所有路由都通过第一个,因为您没有指定 postid 字段只能是数字,或者定义了将捕获 /Posts/New 的早期路由。它通过New 作为postid 传递View 操作。

    您可以在您现在拥有的路径定义之前添加此路径定义

    routes.MapRoute("NewPost",
        "Posts/New",
        new{controller="Posts", action="New"});
    

    或者任何合适的控制器/动作。

    【讨论】:

    • 那么我是否需要为该控制器中的所有其他操作设置路由?
    • 也许只是一个捕获所有非 postid 路由并将它们发送到适当命名的 Action。就像routes.MapRoute("OtherPost", "Posts/{action}/{id}", new{controller="Posts"}, new{action="^[^0-9]"}); 一样,它会捕获所有不以数字开头的 URL,而将这些 URL 留给现有的。
    猜你喜欢
    • 2017-06-23
    • 2018-12-11
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多