3

我正在尝试使用 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”的定义,并且没有扩展方法“GetKeywordByTitle”接受“Tridion.ContentManager.Templating.Package”类型的第一个参数(您是否缺少 using 指令或程序集引用?)

请建议我如何实现它?

提前致谢

4

3 回答 3

4

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;
}
于 2012-10-16T11:16:58.140 回答
3

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

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

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

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

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

于 2012-10-16T08:23:39.607 回答
0

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

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

干杯

于 2012-10-16T08:25:11.000 回答