6

在我正在构建的站点中,我试图使用引用来验证 AJAX 请求来自正确的 URL。

为此,我想让 Sitecore 将 URL 解析为项目。例如,

http://www.mysite.com/abc/def

可能会解析为路径中的项目

sitecore/Content/MySite/Home/abc/def

在我的代码中推荐的解决方法是什么?

4

4 回答 4

7

感谢所有的答案,但他们都没有做我需要的一切。这对我有用。

var url = new Uri(...);

// Obtain a SiteContext for the host and virtual path
var siteContext = SiteContextFactory.GetSiteContext(url.Host, url.PathAndQuery);

// Get the path to the Home item
var homePath = siteContext.StartPath;
if (!homePath.EndsWith("/"))
    homePath += "/";

// Get the path to the item, removing virtual path if any
var itemPath = MainUtil.DecodeName(url.AbsolutePath);
if (itemPath.StartsWith(siteContext.VirtualFolder))
    itemPath = itemPath.Remove(0,siteContext.VirtualFolder.Length);

// Obtain the item
var fullPath = homePath + itemPath;
var item = siteContext.Database.GetItem(fullPath);
于 2012-12-12T21:58:40.113 回答
3

这个答案更适合其他访问这个 SO 问题的访问者。对于 Sitecore 8,您可以这样做:

new Sitecore.Data.ItemResolvers.ContentItemPathResolver().ResolveItem(<string path>)

where<string path>就像 sitecore 能够为您生成的任何本地路径(或相对 url,如果您愿意的话)字符串。Item当使用显示名称值而不是项目名称时(如果您有一个多语言站点,可能会出现这种情况),这对于实际从数据库中检索相应的内容非常方便。

在我的情况下,我使用它来显示一个有效的面包屑,其中父路径确实添加了上下文语言项版本,但请求的页面没有要呈现的上下文语言版本。Sitecore.Context.Database.GetItem(<string path>)无法解析基于显示名称的路径,而 ResolveItem 方法确实...搜索了一天以寻找关于这种情况的好答案。

现在问自己,为什么这个用得不多……?对于拥有一棵大树的站点来说,这可能是一个昂贵的查询。这是你自己要考虑的事情。

于 2019-04-24T15:17:08.287 回答
0

并没有真正得到您想要做的事情(使用您的 AJAX 请求等),但是如果您想http://www.mysite.com/abc/def解析该项目sitecore/content/MySite/Home/abc/def,您需要<site>像这样在 web.config 中配置您的:

<site name="MySite" hostName="www.mysite.com" rootPath="/sitecore/content/MySite" startItem="/Home" *other attributes here* />
于 2012-12-11T08:28:53.023 回答
0

您可以使用该方法ItemManager.GetItem(itemPath, language, version, database, securityCheck)根据其(完整)路径解析项目。

于 2012-12-11T09:04:25.520 回答