我有一个网站,出于商业原因,需要在
之后设置非标准路由设置{id}/{controller}/{action}.
而不是http://site/Controller/Id
,我需要它来路由http://site/Id/Controller
。这在99%的情况下都可以正常工作,但是如果没有提供Id,则会使用假设值(我们只是将其称为“0”)。
我设法通过指定默认值来获取Home控制器,但是让我感到害怕的是试图使http://site/MyController
正常运行,就像它真的是http://site/0/MyController
一样。我尝试的每个组合似乎都试图用“MyController”评估{id}
,而忽略了实际的{id}
。
这是我目前的RegisterRoutes:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
routes.MapRoute(
"Default",
"{id}/{controller}/{action}",
new { controller = "Home", action = "Index", id = "0" }
);
}
答案 0 :(得分:4)
可选细分受众群只能放置在路线的末尾,或者更好地放置在必需的之后。这就是为什么你必须在没有id
段的情况下添加额外的路线定义,并将其默认值定义为0
。
id
是数字public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
routes.MapRoute(
"Default",
"{id}/{controller}/{action}",
new { controller = "Home", action = "Index" },
new { id = @"\d+" }
);
routes.MapRoute(
"DefaultId",
"{controller}/{action}",
new { controller = "Home", action = "Index", id = "0" }
);
}
如您所见,第一个路径定义还包括id
段的约束,该约束要求它为数字。这就是诀窍。
id
是字母数字但不匹配任何控制器名称如果id
不是数字但可以是字母数字,那么您将不得不采取不同的方法......
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
routes.MapRoute(
"DefaultId",
"{controller}/{action}",
new { controller = "Home", action = "Index", id = "0" },
new { controller = @"Home|Admin|Categories|Items" }
);
routes.MapRoute(
"Default",
"{id}/{controller}/{action}",
new { controller = "Home", action = "Index", id = "0" }
);
}
然后你必须在controller
段上加上一个约束,因为你的数量有限。请注意路由定义已经交换,因此无ID的现在是第一个,而id
的那个现在是第二个。只要id
永远不能与控制器名称具有相同的值,这应该有效。
id
可以是任何真正的但是如果id
的值等于控制器名称呢?那么在这种情况下,您将不得不更严格地定义路由规则,因为您很可能必须省略默认值并根据段数提供更多路由:如果需要,可以是零,一,二,三甚至更多。 / p>