Kentico MVC文化URL模式中的两个字母代码

Kentico MVC文化URL模式中的两个字母代码,kentico,kentico-mvc,kentico-12,Kentico,Kentico Mvc,Kentico 12,我试图在Kentico中创建一个更友好的页面URL,使用两个字母的区域性代码(en)而不是完整的区域性代码(en-US)。我修改了页面URL模式,如下图所示。有没有更好的方法,我是否应该创建一个自定义宏表达式 我想实现的另一件事是在URL中没有默认的区域性。也许我也可以使用自定义宏表达式 您可以尝试在本地化->文化中更新文化代码,但是我不确定它是否会有任何副作用如果您使用,您可以连接到GetCulture和GetPage全局事件来执行所需操作 对于GetCulture,您将检查URL是否有两个字

我试图在Kentico中创建一个更友好的页面URL,使用两个字母的区域性代码(en)而不是完整的区域性代码(en-US)。我修改了页面URL模式,如下图所示。有没有更好的方法,我是否应该创建一个自定义宏表达式

我想实现的另一件事是在URL中没有默认的区域性。也许我也可以使用自定义宏表达式


您可以尝试在本地化->文化中更新文化代码,但是我不确定它是否会有任何副作用

如果您使用,您可以连接到GetCulture和GetPage全局事件来执行所需操作

对于GetCulture,您将检查URL是否有两个字母的区域性代码,如果有,则将其用作区域性

如果需要,您也可以调整GetPage,尽管生成的URL段塞应该可以正常工作,除非您希望GetPage上有一个回退。之后,如果没有找到页面,您可以尝试从URL中删除任何区域性,并以此来查找页面


为了便于使用,我建议对UrlPattern的其余部分使用NodeAliasPath。

我已经用自定义宏表达式解决了这个问题。这在URL模式中与DocumentCulture结合使用。宏表达式采用默认区域性为空的区域性别名,否则采用两个字母的代码,并返回带有“/”的区域性别名

页面的url模式:

{%Util.GetUrlCultureCode(DocumentCulture)%}{%NodeAliasPath%}
我为解决这个问题而编写的宏表达式如下所示

public class CustomCultureMacroExpression : MacroMethodContainer
{
    [MacroMethod(typeof(List<string>), "Returns the url culture code of current document", 1)]
    [MacroMethodParam(0, "Culture", typeof(string), "Current culture.")]
    public static object GetUrlCultureCode(EvaluationContext context, params object[] parameters)
    {
        // Branches according to the number of the method's parameters
        switch (parameters.Length)
        {
            case 1:
                return GetCultureAliasOfCulture(parameters[0].ToString());
            case 2:
                // Weird bug causing macro expression in url pattern to have two parameters where the first parameter is null.
                return GetCultureAliasOfCulture(parameters[1].ToString());
            default:
                // No other overloads are supported
                return string.Empty;
        }
    }

    private static string GetCultureAliasOfCulture(string cultureCode)
    {
        var culture = CultureInfoProvider.GetCultureInfo(cultureCode);
        var culturealias = culture?.CultureAlias ?? string.Empty;

        return string.IsNullOrEmpty(culturealias) ? string.Empty : $"/{culturealias}";
    }
}
公共类CustomCultureMacroExpression:MacroMethodContainer { [宏方法(typeof(List),“返回当前文档的url区域性代码”,1)] [MacroMethodParam(0,“区域性”,类型(字符串),“当前区域性”)] 公共静态对象GetUrlCultureCode(EvaluationContext,params对象[]参数) { //根据方法参数的数量进行分支 开关(参数.长度) { 案例1: 返回GetCultureAliasOfCulture(参数[0].ToString()); 案例2: //奇怪的错误导致url模式中的宏表达式有两个参数,其中第一个参数为null。 返回GetCultureAliasOfCulture(参数[1].ToString()); 违约: //不支持其他重载 返回字符串。空; } } 私有静态字符串GetCultureAliasOfCulture(字符串cultureCode) { var culture=cultureinfo.GetCultureInfo(cultureCode); var culturealias=区域性?.culturealias??字符串.Empty; 返回string.IsNullOrEmpty(culturealias)?string.Empty:$“/{culturealias}”; } }
说得好,我想我更喜欢宏,因为这看起来更棘手。嗨,特雷弗,谢谢你的回答。我正在使用动态路由(谢谢)。我的问题是在使用所选页面的RelativePath属性的地方有链接小部件。这使用URL模式,并且应该是特定于区域性的。我不确定您对GetCulture和GetPage事件的确切含义。我现在已经为url模式创建了一个自定义宏表达式。这也修复了url中没有默认区域性的问题。为了提供信息,我将在这个问题中发布这篇文章作为答案:)没问题,DynamicRouting具有GetCulture的事件挂钩,您可以确保从中返回的页面是正确的区域性,但是如果您已经将其连接起来,则在此之前会处理站点的区域性,或者页面的URL slug已经有了正确的模式,那么就设置好了。