基于sitecore中的displayname获取项目

基于sitecore中的displayname获取项目,sitecore,Sitecore,我需要得到一个特定的项目的基础上,它的显示名称,我怎么做呢 例如,我想获取此项目/sitecore/content/mysite/about 但在网站上,它被翻译成多种语言,可能类似于www.site.com/om(在Sitecore中,它将是/Sitecore/content/mysite/om)通常,你不需要这样做。LinkManager(负责生成所有项目URL)有一个选项,可以根据显示名称而不是item.Name创建URL var d = LinkManager.GetDe

我需要得到一个特定的项目的基础上,它的显示名称,我怎么做呢

例如,我想获取此项目/sitecore/content/mysite/about
但在网站上,它被翻译成多种语言,可能类似于www.site.com/om(在Sitecore中,它将是/Sitecore/content/mysite/om)

通常,你不需要这样做。LinkManager(负责生成所有项目URL)有一个选项,可以根据显示名称而不是item.Name创建URL

        var d = LinkManager.GetDefaultUrlOptions();
        d.UseDisplayName = true;
这也可以在配置中配置。在Web.config中查找并修改此部分(或通过包含文件进行修补):



真正做到你所要求的是一个相当复杂的过程。如果将DotPeek指向Sitecore.Pipelines.HttpRequest.ItemResolver,则可以单步执行ResolveUsingDisplayName()方法。它基本上循环子项,将URL部分与“\u显示名称”字段进行比较。你需要做一些类似的事情。

通常,你不需要这样做。LinkManager(负责生成所有项目URL)有一个选项,可以根据显示名称而不是item.Name创建URL

        var d = LinkManager.GetDefaultUrlOptions();
        d.UseDisplayName = true;
这也可以在配置中配置。在Web.config中查找并修改此部分(或通过包含文件进行修补):



真正做到你所要求的是一个相当复杂的过程。如果将DotPeek指向Sitecore.Pipelines.HttpRequest.ItemResolver,则可以单步执行ResolveUsingDisplayName()方法。它基本上循环子项,将URL部分与“\u显示名称”字段进行比较。你必须做一些类似的事情。

你可以采取几种方法。最有效的方法是利用内容搜索API,但挑战在于默认情况下显示名称不包括在索引中。一个简单的补丁文件可以解决此问题:


那么您的代码将类似于:

公共项GetItemByDisplayName(字符串displayName)
{
var searchIndex=ContentSearchManager.GetIndex(“sitecore_master_index”);//将索引名
使用(var context=searchIndex.CreateSearchContext())
{
var搜索结果=
context.GetQueryable()。其中(i=>i[“Display Name”].Equals(displayName)).FirstOrDefault();
返回searchResultItems==null?null:searchResultItems.GetItem();
}
}
这一切都假设您在Sitecore 7上。如果您使用的是Sitecore 6,那么您的选择是有限的,如果您的内容树很大,您的选择可能不会很好地执行。尽管如此,您的函数可能看起来像:

公共项GetItemByDisplayName(字符串displayName)
{
var query=string.Format(“fast:/sitecore/content/*[@uu Display Name='{0}']”,displayName);
var item=Sitecore.Context.Database.SelectSingleItem(查询);
退货项目;
}

请注意,这将是非常低效的,因为在封面下,这基本上是在内容树上行走。

您可以采取几种方法。最有效的方法是利用内容搜索API,但挑战在于默认情况下显示名称不包括在索引中。一个简单的补丁文件可以解决此问题:


那么您的代码将类似于:

公共项GetItemByDisplayName(字符串displayName)
{
var searchIndex=ContentSearchManager.GetIndex(“sitecore_master_index”);//将索引名
使用(var context=searchIndex.CreateSearchContext())
{
var搜索结果=
context.GetQueryable()。其中(i=>i[“Display Name”].Equals(displayName)).FirstOrDefault();
返回searchResultItems==null?null:searchResultItems.GetItem();
}
}
这一切都假设您在Sitecore 7上。如果您使用的是Sitecore 6,那么您的选择是有限的,如果您的内容树很大,您的选择可能不会很好地执行。尽管如此,您的函数可能看起来像:

公共项GetItemByDisplayName(字符串displayName)
{
var query=string.Format(“fast:/sitecore/content/*[@uu Display Name='{0}']”,displayName);
var item=Sitecore.Context.Database.SelectSingleItem(查询);
退货项目;
}

请注意,这将是非常低效的,因为在封面下,这基本上是在内容树上行走。

Hi。。当你说你想得到一个项目,你的意思是使用API,在C#?嗨。。当你说你想得到一个项目,你的意思是使用API,在C#?是的,这正是我所做的,根据显示名称生成URL。它变得更加棘手,因为它是在页面上调用的Web服务,它对Sitecore一无所知,只知道调用它的url(带有显示名称的Sitecore项目),所以我必须根据url回溯到特定项目。但是感谢您的输入,我将尝试找出一些方法。是的,这正是我所做的,根据显示名称生成URL。它变得更加棘手,因为它是在页面上调用的Web服务,它对Sitecore一无所知,只知道调用它的url(带有显示名称的Sitecore项目),所以我必须根据url回溯到特定项目。但是感谢您的输入,我将尝试找出一些问题。我们是否可以包含模板名称以使其更精细?如果我的显示名称带有空格,会怎么样?它无法用作搜索关键字。是否仍然可以包含模板名称以使其更精细?如果我的显示名称带有空格,会怎么样?它无法用作搜索关键字。