MVC路由 - 我想在URL中没有控制器的多个{action}/{id}路由

问题描述:

我设法让我的家庭控制器只使用操作名称来访问它,但只要我添加另一个控制器并尝试通过在我的Home路由声明中添加另一个路由声明来执行相同的操作,所有路由默认为Home控制器。MVC路由 - 我想在URL中没有控制器的多个{action}/{id}路由

routes.MapRoute("HomeTest", "{action}/{id}", new { controller = "Home", action = "TestHome", id = UrlParameter.Optional }); 
routes.MapRoute("TestTest", "{action}/{id}", new { controller = "Test", action = "Test", id = UrlParameter.Optional }); 


public class HomeController : Controller 
{ 
    public ActionResult TestHome(int? id) 
    { 
     return View(); 
    } 
} 

public class TestController : Controller 
{ 
    public ActionResult Test(int? id) 
    { 
     return View(); 
    } 
} 

有没有什么办法可以访问两个控制器,而不在url中包含控制器名称?

我也有默认路线,如果这有什么区别。它在这两条路线下。

航线MVC中添加的顺序进行比较。对于您的代码示例,这意味着所有请求将首先与“HomeTest”路线进行比较,因此任何匹配都将遵循该路线。 “TestTest”路由具有完全相同的格式,这意味着它将永远不会被使用,因为任何匹配都已经使用了“HomeTest”路由。如果您希望在不使用控制器名称的情况下访问控制器的操作,则路由中必须有一些内容来告诉它要使用哪个控制器。这并不一定是实际控制人名称 - 你可以这样做:

routes.MapRoute("TestTest", "keyWord/{action}/{id}", new { controller = "Test", action = "Test", id = UrlParameter.Optional }); 
routes.MapRoute("UsersTest", "otherKeyWord/{action}/{id}", new { controller = "Users", action = "Test", id = UrlParameter.Optional }); 

其中的关键字基本上充当别名隐藏你的控制器名称。你甚至可以更进一步,并掩盖你的动作名称为好,这可以让你使用多个控制器下一个URL根:

routes.MapRoute("TestTest", "test/key1/{id}", new { controller = "Test", action = "Test", id = UrlParameter.Optional }); 
routes.MapRoute("UsersTest", "test/key2/{id}", new { controller = "Users", action = "Test", id = UrlParameter.Optional }); 

做这样的事情可以让你给你的用户一个更为整洁,URL结构帮助他们浏览您的网站,并了解链接将会带到哪里(可能也很方便收藏书签),但这确实意味着您必须手动定义您的网址,这更加有效。

通过定义url模式的方式,路由引擎将始终将与模式{action}/{id}匹配的所有操作重定向到Home控制器。

你要买什么大概是这样的:

routes.MapRoute("HomeTest", "testhome/{id}", new { controller = "Home", action = "TestHome", id = UrlParameter.Optional }); 
routes.MapRoute("TestTest", "test/{id}", new { controller = "Test", action = "Test", id = UrlParameter.Optional });