如何为两个控制器映射相同的路由?

时间:2015-10-18 13:21:44

标签: asp.net-mvc asp.net-mvc-4 model-view-controller asp.net-mvc-routing

我的MVC应用程序中有两个控制器。一个是Home控制器,另一个是User控制器。我正在使用以下RouteConfig设置。

routes.MapRoute(
            "actiononly",
            "{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

我想要abc.com/Blog        abc.com/Login 而不是abc.com/Home/Blog        abc.com/User/Login。 上述配置适用于abc.com/Blog但不适用于abc.com/Login。 如何从两个控制器的链接中删除控制器名称? 另外,我如何才能在网站启动而不是abc.com时显示abc.com/index?我在我的网页中使用以下代码来访问特定页面。

@Html.ActionLink("Home", "Blog", "Home")
@Html.ActionLink("Login", "Login", "User")

3 个答案:

答案 0 :(得分:1)

您的默认路线应自动满足您想要导航到index而无需网址的context.MapRoute( "Site_Default", "{controller}/{action}/{*id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); 部分

您需要确保将主路线指定为默认路线:

void ShortRoute(string action, string controller)
{
    ShortRoute(action, controller, action);
}

void ShortRoute(string action, string controller, string route)
{
    _context.MapRoute(route, route, new { action, controller });
}

如果您想要映射短路线,您可以完全按照上面的步骤进行操作。我在自己的项目中使用这个辅助函数来映射短路径:

ShortRoute("About", "Home");

使用方法:

mywebsite.com/about

这使我可以导航到mywebsite.com/home/about而不是Car

如果它不适用于某些URL,则可能是路由处理程序匹配不同的路由 - 我相信它 取决于您注册它们的顺序

你可以使用一个好的路由调试插件

https://www.nuget.org/packages/routedebugger/

它为您提供所有路线的摘要以及与当前网址匹配的路线 - 非常有用

答案 1 :(得分:1)

如果不引入其他套餐,您只需添加其他路线即可。要创建新路线,首先必须定义您想要的URL。在这种情况下,您已经说过您希望能够转到用户控制器上的/Login。好的 - 让我们创建一条新路线。此路线应位于 ABOVE 您的默认路线。

routes.MapRoute(
            "UserLogin",
            "Login/{id}",
            new { controller = "User", action="Login", id = UrlParameter.Optional }
    );

第一个参数只是路径名。第二个参数是我希望此路由匹配的URL的格式。鉴于我们知道要与此路由匹配的操作,我们不需要默认路由中的{action}{controller} catchall占位符。另请注意,我们可以声明此路由将命中的控制器,而无需在URL中指定控制器。

最后请注意,如果您永远不会将ID参数传递给该函数,则不必将{id}作为路径的一部分。如果是这种情况,那么您可以安全地删除UserLogin路由中对id的任何引用。

当我重新阅读您的问题时,您应该能够为其他一些示例执行此操作。我们将使用/About网址并演示删除{id}参数。

routes.MapRoute(
            "AboutUsPage",
            "About",
            new { controller = "Home", action="About"}
    );

答案 2 :(得分:1)

非常简单。您只需为每个预期的网址创建路线。

请注意,如果您未将控制器或操作作为网址占位符传递,则需要手动将其作为默认值提供。

routes.MapRoute(
        "Blog",
        "Blog/{id}",
        new { controller = "Home", action = "Blog", id = UrlParameter.Optional }
    );
routes.MapRoute(
        "Login",
        "Login/{id}",
        new { controller = "User", action = "Login", id = UrlParameter.Optional }
    );
routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );