如何在 MVC 中使用 rout 从 url 中删除控制器名称
how to remove the controller name from the url using rout in MVC
如何从 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访问URL时,它会提示404错误。
如何解决这个问题
您可以尝试通过首先放置更专业的路线来反转路线定义。此外,您可能不想将操作名称硬编码为 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
时,应该调用 Home
控制器上的 LanginIndex
操作。
另请注意,我已从第一条路线中删除了可选的 {id}
占位符。这样做的原因是因为如果它存在,路由引擎将永远不会使用第二条路由。例如,如果您尝试加载 /Home/Index
,它将在 Home
控制器上查找 Home
操作并将其作为 id
传递 Index
。如果您想拥有此 {id}
令牌,您将需要使用约束来消除第二个更通用的路由定义的歧义。例如,如果您的标识符始终是整数或遵循某种模式,您可以编写一个匹配它们的正则表达式约束。
谢谢达林季米特洛夫
您回复的代码中的小改动帮助我实现了预期的结果
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();
如何从 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访问URL时,它会提示404错误。 如何解决这个问题
您可以尝试通过首先放置更专业的路线来反转路线定义。此外,您可能不想将操作名称硬编码为 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
时,应该调用 Home
控制器上的 LanginIndex
操作。
另请注意,我已从第一条路线中删除了可选的 {id}
占位符。这样做的原因是因为如果它存在,路由引擎将永远不会使用第二条路由。例如,如果您尝试加载 /Home/Index
,它将在 Home
控制器上查找 Home
操作并将其作为 id
传递 Index
。如果您想拥有此 {id}
令牌,您将需要使用约束来消除第二个更通用的路由定义的歧义。例如,如果您的标识符始终是整数或遵循某种模式,您可以编写一个匹配它们的正则表达式约束。
谢谢达林季米特洛夫 您回复的代码中的小改动帮助我实现了预期的结果
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();