Sitecore 为项DisplayName属性生成验证规则

Sitecore 为项DisplayName属性生成验证规则,sitecore,Sitecore,我正在Sitecore中开发一个多语言解决方案,希望使用项目的DisplayName属性来表示URL,以允许使用特定于语言的URL 我已将useDisplayNameweb.config属性设置为true,如下所示 <linkManager defaultProvider="sitecore"> <providers> <clear /> <add name="sitecore" alwaysIncludeServ

我正在Sitecore中开发一个多语言解决方案,希望使用项目的DisplayName属性来表示URL,以允许使用特定于语言的URL

我已将
useDisplayName
web.config属性设置为true,如下所示

<linkManager defaultProvider="sitecore">
  <providers>
    <clear />
    <add name="sitecore" 
         alwaysIncludeServerUrl="false"
         encodeNames="true"
         type="Sitecore.Links.LinkProvider, Sitecore.Kernel"
         addAspxExtension="false"
         shortenUrls="true"
         languageEmbedding="asNeeded"
         languageLocation="filePath"
         useDisplayName="true" />
  </providers>
</linkManager>
一切都很好,除了当用户在上面的设置打开时在DisplayName中输入连字符时Sitecore会中断。。。。如果我关闭上述设置,那么我必须确保用户为DisplayName输入漂亮的连字符分隔值,否则我们会在URL中再次看到讨厌的
%20
s

那么,有没有一种方法可以验证DisplayName属性以禁止或允许使用连字符


或者,更好的是,当encodeNameReplacements事件发生时,有没有一种方法可以钩住执行的任何代码?这将非常理想,因为我可以允许用户为DisplayName输入他们喜欢的任何内容,然后动态清理该值。

如果您在.net reflector(Sitecore.Shell.Framework.Commands.SetDisplayName)中看到源代码,则没有运行的管道

您可以创建一个保存事件,创建显示名称,就像您希望用空格替换hypen一样

public void OnItemSaving(object sender, EventArgs args)
    {
        Item item = Event.ExtractParameter(args, 0) as Item;

        item.Appearance.DisplayName = item.Appearance.DisplayName.Replace("-", " ");
    }

这只是事件的一个简单示例,有一个解决方案,但它需要一些编码,而且相当复杂。 我以前在很多项目中使用过这种解决方案,我知道这是解决这个问题的唯一方法

在保存项目时,您不希望真正用连字符替换空格,因为它对用户不友好。 我的解决方案在运行时工作

首先去掉您添加的
规则

然后创建自己的
LinkProvider
(从Sitecore的默认提供程序继承)。 在LinkProvider中,创建一个方法来“规范化”项的显示名(例如,用连字符替换空格),我们将此方法称为
NormalizeDisplayName()
。让它公开和静态,因为你以后会需要它

因此,现在您已经设法让Sitecore用连字符替换链接中的所有空格。其余部分仍然可以使用默认的提供程序选项(addAspxExtension=“false”useDisplayName=“true”等)进行配置

接下来是
itemsolver
:Sitecore的默认itemsolver将不再识别项目路径,因此您将添加自己的itemsolver来解决此问题

创建一个从
Sitecore.Pipelines.HttpRequest.HttpRequestProcessor
继承的类,并将其配置为在默认项解析器之后的
管道中使用

现在,在处理itemresolver时,您将首先拆分请求的itempath(假设请求了“/category name/subitem name”)。 从siteroot开始(可以从
Sitecore.Context.Site
)循环所有子项,同时使用前面创建的
NormalizeDisplayName()
方法对其项名称进行规范化,直到找到与项路径部分匹配的项

因此,在本例中,循环遍历主项的子项,直到找到一个与规范化的displayname“category name”匹配的项。然后对该项的子项执行相同的操作,直到找到具有规范化displayname“SubItemName”的项

通过这种方式,您可以解析请求的项目,如果原始显示名已包含连字符,则该项也将起作用

很抱歉,我不能给你完整的代码示例,因为它非常复杂,不限于上述内容。如果URL格式不正确,您还需要考虑重定向,并为master/core数据库设置例外以防止Sitecore中断


希望这对你有帮助

您好,我也在考虑类似的问题,但希望在运行时应用一个解决方案,而不是依赖于保存事件-用户可能会觉得有点奇怪,他们的CMS会自动更改他们为某些内容设置的名称。我也在想同样的问题,并试图想出一个解决方案。但是Sitecore中有很多地方可以设置显示名称。自定义命令、项目生成等,您无法编写钩子,以验证inputHi。感谢您的回答。我喜欢在运行中做所有事情,尤其是在用户保存后不重命名东西。像这样通过内容树进行递归是否会对性能造成一点影响?这可能是一个性能问题是的,但前提是您的站点结构中有很多项目(比如超过200个)的文件夹,无论发生什么情况,这些文件夹总是被强烈劝阻的。如果你有一个巨大的站点结构,你可以在ItemResolver中实现缓存。此实现已用于多个高流量网站,但没有造成任何性能问题!
public void OnItemSaving(object sender, EventArgs args)
    {
        Item item = Event.ExtractParameter(args, 0) as Item;

        item.Appearance.DisplayName = item.Appearance.DisplayName.Replace("-", " ");
    }