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

时间:2013-02-18 10:57:26

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

我设法让我的家庭控制器只使用操作名称来访问它,但是只要我添加另一个控制器并尝试通过在我的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();
    }
}

有没有办法在不在网址中包含控制器名称的情况下访问两个控制器?

我也有默认路线,如果这有任何区别。这是在这两条路线下。

2 个答案:

答案 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 });