【问题标题】:How to get the keyword from category name in C# TBB?如何从 C# TBB 中的类别名称中获取关键字?
【发布时间】:2012-10-16 06:34:36
【问题描述】:

我正在尝试使用 C# TBB 获取类别中存在的关键字,以使用以下 DWT TBB 中的输出。

为此,我有一个带有 Category 字段的组件。

我正在尝试编写以下 C# TBB 来获取关键字值。

<%@Import NameSpace="Tridion.ContentManager.Templating.Expression" %>        

try
{
    string className = package.GetValue("Component.Fields.title");  
    KeywordField keywordField = package.GetKeywordByTitle(className);

    package.PushItem("Class", package.CreateStringItem(ContentType.Text, keywordField.Value.Key));


}
catch(TemplatingException ex)
{
    log.Debug("Exception is " + ex.Message);
}

但我收到以下编译错误。

无法编译模板,因为:错误 CS0246:找不到类型或命名空间名称“KeywordField”(您是否缺少 using 指令或程序集引用?)错误 CS1061:“Tridion.ContentManager.Templating .Package 不包含“GetKeywordByTitle”的定义,并且找不到接受“Tridion.ContentManager.Templating.Package”类型的第一个参数的扩展方法“GetKeywordByTitle”(您是否缺少 using 指令或程序集引用?)

请建议我如何实现它?

提前致谢

【问题讨论】:

    标签: tridion tridion-2011


    【解决方案1】:

    Af Jeremy 建议您应该学习 API,我正在为您提供从类别中获取关键字的示例。希望对你有帮助

    包含文件

    using Tridion.ContentManager;
    using Tridion.ContentManager.CommunicationManagement;
    using Tridion.ContentManager.Templating.Assembly;
    using Tridion.ContentManager.ContentManagement;
    using Tridion.ContentManager.ContentManagement.Fields;
    using Tridion.ContentManager.Templating;
    

    示例代码,您可以根据需要在此处使用循环中的键和值。

    string catID = package.GetByName("CategoryID").GetAsString();
            TcmUri catURI = new TcmUri(int.Parse(catID), ItemType.Category, PubId);
            var theCategory = m_Engine.GetObject(catURI) as Category;
            catKeywords = GetCatKeywords(theCategory);
            string strSelect = "<select>";
            foreach (Keyword k in catKeywords)
            {
    
            k.Key  // Keyowrd key
            k.Value // KEyword Value
    
            }
    
    //keyword list  
    private IList<Keyword> GetCatKeywords(Category category)
    {
        IList<Keyword> keywords;
    
        if (!Utilities.IsNull(category))
        {
            Filter filter = new Filter();
            filter.BaseColumns = ListBaseColumns.IdAndTitle;
            keywords = category.GetKeywords(filter);
    
            if (!Utilities.IsNull(keywords))
            {
                return keywords;
            }
        }
    
        return null;
    }
    

    【讨论】:

      【解决方案2】:

      错误消息非常清楚问题所在 - 没有对 KeywordField 类的引用。您需要导入相关的命名空间:

      <%@Import NameSpace="Tridion.ContentManager.ContentManagement.Fields" %>
      

      同样非常清楚的是,Package 对象没有名为 GetKeywordByTitle 的方法。有一个 GetByName 方法,但这是用于从包中检索命名项目,而不是用于从存储库中获取对象。

      Tridion.ContentManager.ContentManagement.Category 确实有一个 GetKeywordByTitle 方法,但要使用它,您必须先获取类别,这可能意味着必须知道类别的 URI。

      也许您需要进一步研究 API 文档?

      【讨论】:

        【解决方案3】:

        “GetKeywordByTitle”不是 Package 上的方法,而是 Category 上的方法。 你不能只更新关键字吗?

        string selectedKeyword= package.GetValue("Component.Fields.title");
        Keyword keyword = new Keyword(selectedKeyword, engine.GetSession());
        

        干杯

        【讨论】:

        • 没有将字符串作为参数之一的关键字构造函数。这个字符串实际上是一个 URI 吗?如果是这样,您将需要使用字符串创建一个 TcmUri 对象,例如TcmUri kwUri = new TcmUri(selectedKeyword)
        猜你喜欢
        • 2012-06-14
        • 1970-01-01
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-02
        • 2014-08-22
        • 1970-01-01
        相关资源
        最近更新 更多