0

在我的工作中,我必须解决一个 URL 重写问题。我必须使用 URL 作为模板:

{controller}/{action}-{id}

代替

{controller}/{action}/{id}

所以处理后的 url 应该是这样的:

myController/myAction-128

其中 128 是一个参数

我的路线图:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

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

控制器代码:

[HttpGet]
        public ActionResult DocumentDetails(int? id)
        {
            if (doc.HasValue)
            {
              ...
            }
        }

这条路线没有提供任何成功的结果。我仍然有 404 错误。当我使用 / 而不是“-”时,一切正常,但我的 JS View 环境无法正常工作。

我能做些什么来解决这个问题吗?所有帮助将不胜感激,谢谢。

4

2 回答 2

4

路线的评估顺序与您定义它们的顺序相同,因此请确保您遵守相同的顺序。id还为(例如作为数字)添加约束将有助于路由引擎消除您的路由的歧义。更不用说在您的示例中您已将 id 令牌设为可选,这当然是不可能的,只有路线的最后一部分可以是可选的。

所以:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "NewRoute",
        url: "{controller}/{action}-{id}/{extId}",
        defaults: new { controller = "Home", action = "Index", extId = UrlParameter.Optional },
        new { id = @"\d+" }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
于 2013-03-24T14:37:08.480 回答
0

我认为您的请求正在由第一个路由规则处理,然后 action-id 被视为一个整体操作并且未被找到。

在默认路由之前设置您的 NewRoute。只需将代码向上移动。

于 2013-03-24T14:39:54.137 回答