0

我在我的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") 

回答

1

你的默认路由会自动满足希望资产净值对abc.com无需URL

你需要确保你的主要途径是指定为默认的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

如果它不工作某些URL可能是路由处理器匹配不同的路由 - 我相信它确实取决于您注册它们的顺序

有一个很好的途径调试插件,您可以使用

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

它给你的所有路由的总结,哪些匹配当前URL - 非常有用

+0

感谢您的回复查尔。几个问题。我在哪里添加'ShortRoute'方法?在RouteConfig文件中?我也可以在哪里调用ShortRoute(“关于”,“家”)?我在我的项目中添加了这个帮助器方法,而不是必须对所有操作使用此方法? –

1

没有带来额外的软件包,你只需添加一条附加路线。要创建新路线,您首先必须定义您想要的网址。在这种情况下,您曾表示您希望能够转到用户控制器上的/Login。好的 - 我们来创建一个新路线。这条路线应该位于高于您的默认路线。

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

第一个参数就是路由名称。第二个参数是我希望此路线匹配的URL的格式。鉴于我们知道我们想要匹配此路线的行动,我们不需要默认路线中的{action}{controller}全方位占位符。另外请注意,我们可以声明此路由将命中什么控制器,而无需在URL中指定控制器。

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

当我重新阅读您的问题时,您应该也可以为其他一些示例执行此操作。我们来看看/About的URL,并演示{id}参数的删除。

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

如果我在两个控制器中都有多个动作会怎么样?而不是“登录/ {id}”对其他操作无效。我该如何继续? –

+0

正确,在某些时候,您将在路线中拥有控制器名称,因为上述情况会变得不稳定。我相信你也可以使用通配符映射。这真的取决于你为什么需要你的网址来寻找你想要的方式。有时,额外的工作可能不值得在URL中保存四个字符。 – Tommy

1

这是非常简单。您只需要为每个预期的网址创建一个路由。

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

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 } 
    ); 
相关问题