Kentico MVC文化URL模式中的两个字母代码
我试图在Kentico中创建一个更友好的页面URL,使用两个字母的区域性代码(en)而不是完整的区域性代码(en-US)。我修改了页面URL模式,如下图所示。有没有更好的方法,我是否应该创建一个自定义宏表达式 我想实现的另一件事是在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是否有两个字
您可以尝试在本地化->文化中更新文化代码,但是我不确定它是否会有任何副作用如果您使用,您可以连接到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已经有了正确的模式,那么就设置好了。