如何使用MVC中的路由从URL中删除控制器名称

时间:2016-01-07 08:23:19

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

如何从MVC 5中的URL中删除控制器名称。我尝试在route.config中添加路由

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapMvcAttributeRoutes();
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
        routes.MapRoute(
           name: "Special",
           url: "action/{id}",
           defaults: new { controller = "Home", action = "LandingIndex", id = UrlParameter.Optional }
       );
    }
}

当我尝试通过http://localhost:24220/LandingIndex访问网址时,会提示404错误。 如何解决这个问题

2 个答案:

答案 0 :(得分:1)

您可以尝试通过首先放置更专业的路线来反转路线定义。此外,您可能不希望将操作名称硬编码为action,而是使用{action}占位符:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapMvcAttributeRoutes();

        routes.MapRoute(
            name: "Special",
            url: "{action}",
            defaults: new { controller = "Home", action = "LandingIndex" }
        );

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

现在,当您导航到/LandingIndex时,应调用LanginIndex控制器上的Home操作。

另请注意,我已从第一条路线中删除了可选的{id}占位符。原因是因为如果存在,路由引擎将永远不会使用第二条路由。例如,如果您尝试加载/Home/Index,它会在Home控制器上查找Home操作并将其Index作为id传递。如果您想拥有此{id}令牌,则需要使用约束来与第二个更通用的路由定义进行歧义。例如,如果您的标识符始终是整数或遵循某种模式,则可以编写与其匹配的正则表达式约束。

答案 1 :(得分:1)

谢谢Darin Dimitrov 您回复的代码几乎没有变化,这有助于我实现预期的结果

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        //routes.MapMvcAttributeRoutes();

    routes.MapRoute(
        name: "Special",
        url: "{action}",
        defaults: new { controller = "Home", action = "LandingIndex" }
    );

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

只是删除以下行帮助我

  

routes.MapMvcAttributeRoutes();