asp.net mvc路由和神秘的404

时间:2011-01-16 00:24:21

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

我是.net mvc的新手。 简而言之,我想看看我的网站,以便人们可以输入: mywebsite /约翰@埃里克 并由正确的控制器处理。

另一方面,我希望能够指定直接行动,例如: mywebsite / GetPeople

并通过GetPeople行动获取。

我在我的应用程序中设置了两个路由规则:

第一条路线

    routes.MapRoute("Default",
                    "{id}",
            new { controller = "Friends", action = "Index", id = UrlParameter.Optional },
            new { controller = @"[^\.]*", id = @"(?i)[a-z]*@[a-z]*" }
        );

第二条路线

    routes.MapRoute(
        "Friends",
        "{action}/{id}",
        new { controller = "Friends" }
        );

第一个和默认路由效果很好,但是当我发送这样的请求时:mywebsite / GetPeople cheacky索引操作接管并读取GetPeople,就好像它是一个参数。即使我添加了我真正令人敬畏的regax,但这似乎不起作用。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

以下是您的路线的外观:

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

    routes.MapRoute(
        "Friends",
        "{id}",
        new { controller = "Friends", action = "Index", id = UrlParameter.Optional },
        new { id = @"(?i)[a-z]*@[a-z]*" }
    );

    routes.MapRoute(
        "Default",
        "{action}/{id}",
        new { controller = "Friends", action = "Index", id = UrlParameter.Optional }
    );
}

现在mywebsite/John@Eric将由Index控制器的Friends操作处理,而mywebsite/GetPeople将由GetFriends Friends操作处理控制器。

答案 1 :(得分:0)

这是因为路由在MVC中的工作方式。它只是按照在RegisterRoutes中声明路由的顺序匹配传入的URL和路由。在这种情况下,URL中的GetPeople将与Id参数匹配,因为一切都是可选的。要解决这个问题,我会添加一个默认值作为最后一个路由。它可以这样做

routes.MapRoute("", "{controller}/{action}", new { controller = "Friends",action="Index" });

这将处理GetMyPeople URL。你需要对它进行索引操作。 MvcContrib有一个出色的测试帮助程序,用于在从应用程序实际运行MVC路由之前测试它们。您可以获取位here