在MVC 5网站的URL中启用连字符

时间:2015-07-24 17:21:51

标签: asp.net-mvc-routing

我的项目是多语言的,也有路由,但我需要在网址中允许使用连字符,例如:example.com/en/our-team。

在这个网站(http://www.bousie.co.uk/blog/allow-dashes-within-urls-using-asp-net-mvc4/)中,我找到了一个解决方案,在Global.asax中添加以下代码:

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.cs上,替换为:

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index",
  id = UrlParameter.Optional }
);

有了这个:

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

问题在于我不知道如何在我的代码中执行此操作:

using System.Web.Mvc;
using System.Web.Routing;

namespace theme_mvc
{
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapLocalizeRoute("Default",

            url: "{culture}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });

        routes.MapRouteToLocalizeRedirect("RedirectToLocalize",

                    url: "{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
    }
    }
    }

我如何调整我的代码以支持URL中的连字符( - )?

1 个答案:

答案 0 :(得分:0)

您发布的链接使用了错误的方法。路由是双向映射,但如果您只自定义MvcRouteHandler,则只考虑传入路由。

此问题经常发生,有人在GitHub上创建了一个hyphenated lowercase route项目,除了你需要将它与你MapLocalizeRoute调用的路由结合起来之外,它会做你想做的事情。扩展方法。

但是,由于您尚未发布MapLocalizeRouteMapRouteToLocalizeRedirect的代码,我无法告诉您这是如何完成的。