如何找出与项目相关联的Sitecore站点?

wil*_*end 11 sitecore

我们有一个多站点解决方案(站点1和站点2),我需要能够确定我们获取URL的项目(在LinkProvider中,是自定义的)是否属于当前上下文站点(Sitecore.Context.Site),或者是不同网站的一部分.有没有办法做到这一点?

基本上,我们只需要能够找出该项目与哪个站点相关联.我们可以在该值与当前上下文站点之间进行比较.

Ruu*_*ier 10

我建议你为Item类创建一个扩展方法,它返回一个SiteInfo包含它所属站点定义的对象.

不幸的是我没有我的笔记本电脑和我的所有代码,所以我只是在Visual Studio中键入它并确保它构建,但我很确定它的工作原理:

public static class Extensions
{
    public static Sitecore.Web.SiteInfo GetSite(this Sitecore.Data.Items.Item item)
    {
        var siteInfoList = Sitecore.Configuration.Factory.GetSiteInfoList();

        foreach (Sitecore.Web.SiteInfo siteInfo in siteInfoList)
        {
            if (item.Paths.FullPath.StartsWith(siteInfo.RootPath))
            {
                return siteInfo;
            }
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在你可以GetSite()在所有Item对象上调用该方法并检索该SiteInfo项目.您可以使用它来检查它是否与您匹配Sitecore.Context.Site,例如通过执行以下操作:

SiteInfo siteInfo = itemYouNeedToCheck.GetSite();
bool isContextSiteItem = Sitecore.Context.Site.SiteInfo.Equals(siteInfo);
Run Code Online (Sandbox Code Playgroud)

编辑:我只是认为你也可以做得更短,像这样:

public static Sitecore.Web.SiteInfo GetSite(this Sitecore.Data.Items.Item itemYouNeedToCheck)
{
    return Sitecore.Configuration.Factory.GetSiteInfoList()
        .FirstOrDefault(x => itemYouNeedToCheck.Paths.FullPath.StartsWith(x.RootPath));
}
Run Code Online (Sandbox Code Playgroud)

所以选择你最喜欢的:)

  • web.config中网站定义的顺序非常重要,因为它决定了如何解析"属于"多个网站的项目. (4认同)
  • 这仅适用于每个项目只有一个可能的上下文站点的情况,如果您有多个域指向同一个主页项目(例如支持国家/语言特定域),则情况并非如此。这个问题实际上有不同的问题:1)这个项目是当前站点内容树的一部分,2)如果不是,它属于哪个站点。 (2认同)

zha*_*nke 6

我赞成了Ruud van Falier的回答,然后经过几轮测试后我意识到它只适用于某些场景.无法取消投票,所以我在这里对代码进行了一些修改:

    public static SiteInfo GetSite(this Item item)
    {
        var siteInfoList = Sitecore.Configuration.Factory.GetSiteInfoList();

        SiteInfo currentSiteinfo = null;
        var matchLength = 0;
        foreach (var siteInfo in siteInfoList)
        {
            if (item.Paths.FullPath.StartsWith(siteInfo.RootPath, StringComparison.OrdinalIgnoreCase) && siteInfo.RootPath.Length > matchLength)
            {
                matchLength = siteInfo.RootPath.Length;
                currentSiteinfo = siteInfo;
            }
        }

        return currentSiteinfo;
    }
Run Code Online (Sandbox Code Playgroud)

所以问题是其他内置站点通常具有较短的路径,如"/ sitecore/content",它会在到达实际站点配置之前与您的内容路径匹配.所以这段代码试图返回最佳匹配.


Bra*_*ath 6

/// <summary>
/// Get the site info from the <see cref="SiteContextFactory"/> based on the item's path.
/// </summary>
/// <param name="item">The item.</param>
/// <returns>The <see cref="SiteInfo"/>.</returns>
public static SiteInfo GetSiteInfo(this Item item)
{
  return SiteContextFactory.Sites
    .Where(s => !string.IsNullOrWhiteSpace(s.RootPath) && item.Paths.Path.StartsWith(s.RootPath, StringComparison.OrdinalIgnoreCase))
    .OrderByDescending(s => s.RootPath.Length)
    .FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)