1

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

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

如果这有什么不同,我还包括默认路线。就在这两条路线下。

4

2 回答 2

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

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

于 2013-02-18T12:12:04.703 回答
2

通过您定义 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 });
于 2013-02-18T11:42:34.630 回答