我是.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,但这似乎不起作用。
有什么想法吗?
答案 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