如何使控制器的名称连字符“ – ”分开?

我能够使用

[ActionName("My-Action-Name")] public ActionResult MyActionName() { return View(); } 

但我在更改控制器名称时遇到问题。 是否有一些注释可用于在MVC 4中分隔控制器名称连字符( – )?

有点像这样:

 [ControllerName("My-Controller-Name")] public class MyControllerName : Controller { } 

这是一个很好的答案:

添加自定义路由处理程序(在替换部分中选择您想要处理连字符的方式):

 public class HyphenatedRouteHandler : MvcRouteHandler { protected override IHttpHandler GetHttpHandler(RequestContext requestContext) { requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", ""); requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", ""); return base.GetHttpHandler(requestContext); } } 

并在RouteConfig使用它

 routes.Add( new Route("{controller}/{action}/{id}", new RouteValueDictionary( new { controller = "Home", action = "Index", id = UrlParameter.Optional }), new HyphenatedRouteHandler()) ); 

您可以使用属性路由 。

它也出现在MVC 5中。

你可以在下面找到一些例子。

http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

 [RoutePrefix("Book-Reviews")] public class ReviewsController : Controller { // eg.: /reviews [Route] public ActionResult Index() { ... } // eg.: /reviews/5 [Route("{reviewId}")] public ActionResult Show(int reviewId) { ... } // eg.: /reviews/5/edit [Route("{reviewId}/edit")] public ActionResult Edit(int reviewId) { ... } } 

我喜欢@aleha的答案,但是想为MapRoute做这个,因为我需要一个路由名称。

在这种情况下,您可以这样做:

  Route route = routes.MapRoute( "RouteName", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); route.RouteHandler = new HyphenatedRouteHandler(); 

感谢@R。 Schreurs解决方案。 这就是我的RouteConfig类现在看起来像我的控制器名称现在使用连字符。

 public class RouteConfig { public class HyphenatedRouteHandler : MvcRouteHandler { protected override IHttpHandler GetHttpHandler(RequestContext requestContext) { requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", ""); requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", ""); return base.GetHttpHandler(requestContext); } } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ).RouteHandler = new HyphenatedRouteHandler(); } }