我设法让我的家庭控制器只使用操作名称来访问它,但是只要我添加另一个控制器并尝试通过在我的Home路由声明中添加另一个路由声明来做同样的事情,所有路由都默认为Home控制器。
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();
}
}
有没有办法在不在网址中包含控制器名称的情况下访问两个控制器?
我也有默认路线,如果这有任何区别。这是在这两条路线下。
答案 0 :(得分:3)
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 });
执行此类操作可让您为用户提供更整洁的网址结构,以帮助他们浏览您的网站并了解链接带来的位置(也可能方便用于书签),但这确实意味着您必须手动定义网址,这是更多的工作。
答案 1 :(得分:2)
通过定义网址模式的方式,路由引擎将始终将与模式{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 });