使用生成的页面类型类

时间:2016-12-20 16:44:23

标签: kentico

我正在尝试使用TreeProvider来查询所有从基页类型继承的页面,此处称为My.Product。我还为该基页类型集成了生成的C#类,以便获得对页面类型值的强类型访问。

以下查询,不使用生成的页面类型,工作正常:

        //returns all products as TreeNode
        var products = tree.SelectNodes()
            .OnSite("MyWebSite")
            .Types("My.Product*")

将生成的类型与SelectNodes的通用版本一起使用,不能使用Types扩展名,也不会返回任何页面。我假设因为未包含继承的页面类型。

        //returns nothing
        var products = tree.SelectNodes<Product>()
                           .OnSite("MyWebSite");

基于this answer我尝试了演员:

        var products = tree.SelectNodes()
            .OnSite("MyWebSite")
            .Types("My.Product*")
            .ToList()
            .Cast<Product>();

但演员阵容失败了:

  

无法将“CMS.Ecommerce.SKUTreeNode”类型的对象转换为“CMS.DocumentEngine.Types.Product”。

我也尝试从查询结果构建页面类型对象:

        var products = tree.SelectNodes()
            .OnSite("MyWebSite")
            .Types("My.Product*")
            .ToList()
            .Select(x => TreeNode.New<Product>(null, x, tree))
            .ToList();

但API不喜欢类名不匹配:

  

输入类名称'My.ProductInheritingType与请求的类型'CMS.DocumentEngine.Types.Product'不一致,其类名为'My.Product'。要解决此问题,请使用正确的类名或null作为输入参数。

有没有办法在我的强类型页面类型中使用TreeProvider,并检索使用继承页面类型的页面?

2 个答案:

答案 0 :(得分:0)

我不知道这是不是最好的方法,但它现在正在运作。有几个问题需要克服:

  1. 查询所有继承类型
  2. 确保返回的数据包含所有需要的列
  3. 映射到页面类型类
  4. 对于上面的最后一项,如果文档类名称不匹配,我找不到让Kentico API初始化我的基本Product类型的方法。所以我不得不扩展生成的类并调用受保护的初始化方法:

    public partial class Product
    {
        public void Initialize(IDataContainer data, TreeProvider treeProvider)
        {
            base.Initialize(this.ClassName, data, treeProvider);
        }
    }
    

    然后,我可以在LINQ语句中构造和初始化此类,该语句还包括查询我的基页类型的所有继承类型,所有支持数据列使用DocumentHelper API而不是{{1 }}

    TreeProvider

答案 1 :(得分:-1)

您可以使用.WhereEquals(“ClassInheritsFromClassID”,TheMyProductClassID)来获取从该类继承的所有类。这可能是最好的路线。下面应该是大致正确的语法。

int MyProductClassID = DataClassInfoProvider.GetClassInfo("My.Product").ClassID;
var AllInheritedClassIDs = DataClassInfoProvider.GetClasses().WhereEquals("ClassInheritsFromClassID", MyProductClassID).Select(x=> x.ClassID).ToList();

var products = tree.SelectNodes()
            .OnSite("MyWebSite")
            .WhereIn("NodeClassID", AllInheritedClassIDs);
            .ToList();