如何使控制器的名称连字符#34; - "分开吗?

时间:2014-10-03 08:57:54

标签: c# asp.net-mvc asp.net-mvc-4

我可以使用

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

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

有点像这样:

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

}

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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 :(得分:1)

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

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

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

    route.RouteHandler = new HyphenatedRouteHandler();

答案 3 :(得分: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();
    }
}