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

Kentico MVC culture two letter code in URL pattern

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

我想实现的另一件事是让默认文化不在 URL 中。也许我也可以使用自定义宏表达式。

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

如果您使用 Dynamic Routing module,您可以连接到 GetCulture 和 GetPage 全局事件来执行您要查找的操作。

对于 GetCulture,您将检查 URL 是否有 2 个字母的文化代码,如果有,则将其用作文化。

如果需要,您也可以调整 GetPage,尽管生成的 URL slug 应该可以正常工作,除非您想回​​退到 GetPage.After,如果没有找到页面,您可以尝试从 URL 中删除任何文化并以此查找页面。

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

我已经用自定义宏表达式解决了这个问题。这在 URL 模式中与 DocumentCulture 结合使用。宏表达式采用文化别名(在默认文化为空的情况下)和两个字母代码,returns 这带有“/”。

页面的 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}";
    }
}