2

我之前也有过类似的问题,但是这比这更进一步,所以我们开始吧:

我正在尝试访问 Tridion 2011 中某个类别的值。我正在使用 Razor TBB 并使用此代码来执行此操作:

@foreach (var keyword in Publication.MetaData.myCategory) {
  @: Hello World!
}

我已经设置了一个元数据模式,其中包含一个附加到我的出版物的 xml 名称为“myCategory”的字段。如果我在 myCategory 是文本字段的出版物上运行此代码,则此代码可以工作……有点。它将每个字符视为关键字变量的单独值......所以如果我输入文本“one”,打印的是“Hello World!Hello World!Hello World!”,如果我只有“o”作为值,它打印“Hello World!”。

奇怪的是(我也想知道为什么),我真正希望该字段成为“将从列表中选择值”类型的字段,指向我在类别和关键字中的类别。当我这样做时,myCategory 的值更改为在此类字段的下拉列表中选择的项目的值,而不是直接文本输入,代码不再起作用并给出此错误:

无法将类型“Tridion.Extensions.Mediators.Razor.Models.KeywordModel”隐式转换为“System.Collections.IEnumerable”。存在显式转换(您是否缺少演员表?)

请帮我。

4

1 回答 1

1

如果您为字符串中的每个字符重复输出,那么您显然是在迭代字符串中的字符,而不是您期望的其他值范围。

我快速查看了 Razor mediator 的相关代码,它的ToString方法确实返回了底层的 Title RepositoryLocalObject

http://code.google.com/p/razor-mediator-4-tridion/source/browse/trunk/Tridion.Extensions.Mediators.RazorMediator/Tridion.Extensions.Mediators.RazorMediator/Models/AbstractRepositoryLocalObject.cs

http://code.google.com/p/razor-mediator-4-tridion/source/browse/trunk/Tridion.Extensions.Mediators.RazorMediator/Tridion.Extensions.Mediators.RazorMediator/Models/KeywordModel.cs

http://code.google.com/p/razor-mediator-4-tridion/source/browse/trunk/Tridion.Extensions.Mediators.RazorMediator/Tridion.Extensions.Mediators.RazorMediator/Models/DynamicItemFields.cs

文件中处理关键字字段的代码DynamicItemsFields.cs

else if (itemField is KeywordField)
{
    KeywordField keywordField = (KeywordField)itemField;
    if (keywordField.Definition.MaxOccurs == 1)
        if (keywordField.Value == null)
            _dictionary[key] = null;
        else
            _dictionary[key] = new KeywordModel(_engine, keywordField.Value);
    else
    {
        List<KeywordModel> keywords = new List<KeywordModel>();
        int i = 0;
        foreach (Keyword k in keywordField.Values)
        {
            var kw = new KeywordModel(_engine, k);
            kw.Index = i++;
            kw.IsLast = Index == keywordField.Values.Count - 1;
            keywords.Add(kw);
        }
        _dictionary[key] = keywords;
    }
}

所以看起来该myCategory属性要么是 KeywordModel 对象(如果 KeywordField 是单值),要么是List<KeywordModel>(如果 KeywordField 在 Schema 中被标记为多值)。你的myCategory字段是单值吗?还是多值?

如果是单值,您期望什么类型的输出?如果您期待允许值的列表(而不是当前选择的值),请检查您是否可以通过myCategory.Definition某种方式访问​​它(应该是常规的 TOM.NETKeywordFieldDefinition对象)。

于 2012-06-26T16:59:40.450 回答