Sitecore MVC路由以解析带连字符的名称

时间:2014-06-24 10:24:28

标签: asp.net-mvc sitecore sitecore6

我正在尝试使用Sitecore MVC路由为我提供

路径中的内容
  

/ Home / Test Url / With Space

来自网址:

  

/测试-URL /与空间

所以我需要Sitecore能够识别URL有连字符,但仍然可以解析为没有连字符的路径。

这是我到目前为止所做的:

routes.MapRoute(
   name: "Hyphenated URL",
   url: "test-url/{valuename}",
   defaults: new { scItemPath = "/Home/Test Url/{valuename}" });

这适用于以下路径:

  

/ test-url / with space

但如果我在“with”和“space”之间添加连字符,我无法解决它。我猜我需要一个自定义路由处理器。有任何想法吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以创建自定义路线。

routes.MapHyphenatedRoute(
    name: "Hyphenated URL",
    url: "{controller}/{action}",
    defaults: new { scItemPath = "/Home/{controller}/{action}" }
    );

这里的想法是用连字符拦截路线值并将它们转换为您想要的格式。没有连字符的网址将保持不变。 Sitecore 仍需要能够处理scItemPath

public static class RouteCollectionExtensions
{
    public static Route MapHyphenatedRoute(this RouteCollection routes, string name, string url, object defaults)
    {
        var route = new HyphenatedRoute(url, defaults);
        routes.Add(name, route);
        return route;
    }
}

public class HyphenatedRoute : Route
{
    public HyphenatedRoute(string url, object defaults) :
        base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
    { }

    public override RouteData GetRouteData(System.Web.HttpContextBase httpContext)
    {
        var routeData = base.GetRouteData(httpContext);

        if (routeData != null)
        {
            RouteValueDictionary values = routeData.Values;
            values["controller"] = Dehyphenate(values["controller"] as string);
            values["action"] = Dehyphenate(values["action"] as string);
        }

        return routeData;
    }

    public override VirtualPathData GetVirtualPath(RequestContext ctx, RouteValueDictionary values)
    {
        values["controller"] = Hyphenate((values["controller"] as string));
        values["action"] = Hyphenate(values["action"] as string);
        return base.GetVirtualPath(ctx, values);
    }

    private static string Hyphenate(string value)
    {
        if (!string.IsNullOrEmpty(value) && value.IndexOf(' ') >= 0)
        {
            return System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToLower(value.Replace(' ', '-'));
        }

        return value;
    }

    private static string Dehyphenate(string value)
    {
        if (!string.IsNullOrEmpty(value) && value.IndexOf('-') >= 0)
        {
            return System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(value.Replace('-', ' '));
        }

        return value;
    }
}

您的方案可能需要不同的处理,但如果您需要路由转换,此代码可能会有所帮助。

答案 1 :(得分:0)

Sitecore 7开箱即用,但在Sitecore 6.x中,您需要将以下内容添加到web.config中的<encodeNameReplacements>元素中:

<replace mode="on" find=" " replaceWith="-" />

这基本上会告诉Sitecore将URL中的连字符映射到项目名称中的空格。