2014-10-03 27 views
4

我能够使用如何使控制器的名称连字符“ - ”分开?

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

但我在改变控制器的名称面临的一个问题。 是否有一些注释可用于使控制器名称连字符( - )在MVC 4中分开?

有点像这样:

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

} 
+0

这是路由问题,而不是重命名。定义路线时应该这样做。 – 2014-10-03 09:04:42

回答

4

Here是一个很好的答案:

添加自定义路由处理程序(在更换部分选择您希望如何处理连字符):

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()) 
     ); 
+0

如果您需要路由名称,请参阅[下面](http://stackoverflow.com/a/32716734/456456)以获取使用MapRoute的替代方案。 – 2015-09-22 12:22:35

4

您可以使用Attribute Routing

它也出现在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) { ... } 
} 
+2

提供一些例子而不仅仅是一个链接可能是有用的。 – 2014-10-03 09:03:05

+0

属性路由*仅适用于MVC 5.您不能在MVC中使用它4 – 2014-10-03 09:03:19

+1

有一个nuget包。是的你可以。 – DarthVader 2014-10-03 09:03:51

1

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

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

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

    route.RouteHandler = new HyphenatedRouteHandler(); 
0

感谢@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(); 
    } 
} 
相关问题