Sitecore 7 - 在整个子页面中维护基于特定父项的导航

Sitecore 7 - Maintain navigation based on specific parent item throughout subpages

这是一个奇怪的问题,但我认为如果我解释一下会更容易理解:我已经有一段时间没有使用 Sitecore 7 了,我正在为子页面构建侧边导航。这是在站点树中设置子页面的方式:

如果我在产品着陆页上,那么我会得到所有的产品类别(我已经完成了这个功能)。当我在产品类别页面上时,我获得了所有产品列表(产品类别模板的子项)(此功能有效)。

但是,当我在产品列表页面或产品页面上时,我对如何保持与产品类别页面上相同的导航感到困惑。我知道我需要检查我所在的当前页面的父页面,但我不确定最好的方法。

这是我开始的,它适用于产品类别页面,因为它获取所有产品列表子项和所有产品子项。

    private void Page_Load(object sender, EventArgs e)
    {
        var db = Sitecore.Context.Database;
        this.currentItem = Sitecore.Context.Item;

        //get the product
        var productCategoryItem = db.Items.GetItem(this.currentItem.ID);
        var productListings = productCategoryItem.Children
            .Where(d => d.TemplateID.ToString() == productListingTemplateID);

        ProductCategories.DataSource = productListings;
        ProductCategories.DataBind();

    }

     protected void ProductCategories_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {

        var catItem = e.Item.DataItem as Item;
        Repeater categoriesRepeater = e.Item.FindControl("CategoriesRepeater") as Repeater;
        var catProducts = catItem.GetChildren();

        if (catProducts.ToList().Count == 0)
        {
            return;
        }

        categoriesRepeater.DataSource = catProducts;
        categoriesRepeater.DataBind();
    }

更新:这段代码按照我想要的方式工作,但当我进入产品页面时,我发现它重复而且不够清晰。我无法指定产品项目 ID 或模板 ID,因为产品使用不同的模板(不知道为什么,但这就是它们的设置方式。不过,产品页面是产品列表页面的子项,产品列表页面是子项产品类别页面等):

  if (currItem.TemplateID.ToString() == productCategoryTemplateID.ToString())
        {
            productCategoryItem = db.Items.GetItem(currItem.ID);
        }
        else
        {
            if (currItem.TemplateID.ToString() == productListingTemplateID.ToString())
            {
                productCategoryItem = db.Items.GetItem(currItem.ParentID);

            }
            else
            {
                productCategoryItem = db.Items.GetItem(currItem.Parent.ParentID);
            }
        }
        var productListings = productCategoryItem.Children
               .Where(d => d.TemplateID.ToString() == productListingTemplateID);

        ProductCategories.DataSource = productListings;
        ProductCategories.DataBind();

虽然我对如何使用 if 语句执行此操作有想法,但我不希望代码变得重复和乏味。是否可以通过某种 while 循环来完成我想要的?

您似乎正在尝试创建一种方法,根据您当前的上下文项目returns 相关产品列表。一种选择是引入祖先查询(请注意,这使用 C#6 语法进行字符串格式化)

productListings = currItem.Axes.SelectItems($"ancestor-or-self::*[@@templateid='{productCategoryTemplateID}']/*[@@templateid='{productListingTemplateID}']")

仅当产品类别项目可以包含产品列表以外的子项时,才需要查询末尾的模板检查