可以使用null {id}设置{id} / {controller} / {action}路由吗?

时间:2011-11-28 19:58:55

标签: asp.net-mvc asp.net-mvc-routing

我有一个网站,出于商业原因,需要在

之后设置非标准路由设置
{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" }
    );
}

1 个答案:

答案 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>