如何在内部区域用短划线替换下划线?

时间:2012-10-23 09:23:07

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

我在我的网站上使用asp.net MVC 3,我想用地址中的破折号替换下划线。我能做到 。但是当我想在一个区域内更换它们时,我无法做到。

谁能帮助我?

这是我的代码:

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

这是我的地区路线:

context.MapRoute(
                "products_default",
                "products/{controller}/{action}",
                new { controller = "All", action = "Index" }
            );

我想浏览此地址:

本地主机:1559 /产品/存储助洗剂/ boronz

产品是我的地区名称。当然,当我浏览这个地址时:

本地主机:1559 /产品/ store_builder / boronz

显示页面。

编辑:

我将它用于我的区域路线,但它无法检测到这是一个区域:

//context.Routes.Add(
//    new Route("products/{controller}/{action}",
//    new RouteValueDictionary(
//        new { controller = "", action = "Index" }),
//        new MyProject.MvcApplication.HyphenatedRouteHandler())
//);

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我认为您可以轻松选择调整路线:

context.MapRoute(
    "products_default",
    "products/store-builder/{action}",
    new { controller = "YourControllerName", action = "Index" }
); 

然而,这样做的缺点是,随着控制器数量的增长,您将需要创建大量路径。此外,我可能已经回答了类似的问题here,它会像您的示例一样创建自定义路径处理程序。

答案 1 :(得分:0)

你正在调用string.replace错误:第一个参数是将被第二个参数替换的旧值。

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