仅使用'x'前缀导致的神秘404路由错误?

Mic*_*uda 2 c# asp.net-mvc url-routing asp.net-mvc-routing asp.net-mvc-5

我想保持我的网址尽可能短,所以我正在测试没有分隔符的路由,如下所示:

routes.MapRoute(
   name: "Photo",
   url: "x{id}",
   defaults: new { controller = "Content", action = "Photo" }
);
Run Code Online (Sandbox Code Playgroud)

由于某种原因,上面的路线不起作用,我收到404错误:

无法找到该资源.

说明:HTTP 404.您要查找的资源(或其中一个依赖项)可能已被删除,名称已更改或暂时不可用.

但是,当我为不同的字母更改x前缀时,例如g,它工作正常.

没有冲突的路线.我在这里想念的是什么?

编辑:

我再次看到这个问题,我观察到404可能只发生在id包含x,即路线喜欢/xa1B2/xZ9y8完美无缺,但x12xG失败了.请问有什么想法吗?

Nig*_*888 7

每个MSDN:

您可以在分隔符之间定义多个占位符,但它们必须用常量值分隔.例如,{language} - {country}/{action}是有效的路由模式.但是,{language} {country}/{action}不是有效模式,因为占位符之间没有常量或分隔符.因此,路由无法确定将语言占位符的值与国家/地区占位符的值分开的位置.

正如您已经说过的那样,当您的id以a开头时,会发生错误x.这是因为它无法区分您的id值和您选择的常量之间的差异.

您可以使用一些选项来解决此问题:

  1. 在常量和占位符之间放置一个分隔符,该分隔符不作为任何"id"的第一个字符出现.
  2. 为常量选择一个字符,该常量不会作为任何"id"的第一个字符出现.
  3. 更改"id",使其无法启动x.
  4. 添加一个重复的路由,一个带有约束的路由,当"id"包含时绕过,x并用另一个字符开始第二个路由.

第四个选项看起来像这样:

// Ids that don't contain x will use this route
routes.MapRoute(
   name: "Photo_X",
   url: "x{id}",
   defaults: new { controller = "Content", action = "Photo" },
   constraints: new { id = @"(?i)[^x]" }
);

// Ids that contain x will use this route instead
routes.MapRoute(
   name: "Photo_Y",
   url: "y{id}",
   defaults: new { controller = "Content", action = "Photo" }
);
Run Code Online (Sandbox Code Playgroud)