我正在尝试使用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”之间添加连字符,我无法解决它。我猜我需要一个自定义路由处理器。有任何想法吗?提前谢谢。
答案 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中的连字符映射到项目名称中的空格。