之前我遇到过类似的问题,但这只是前面几步,所以我们走了:
我正在尝试访问Tridion 2011中某个类别中的值。我正在使用Razor TBB并使用此代码执行此操作:
@foreach (var keyword in Publication.MetaData.myCategory) {
@: Hello World!
}
我已经设置了一个元数据模式,其中包含一个附加到我的出版物的xml名称为“myCategory”的字段。如果我在myCategory是Text字段的出版物上运行它,那么这段代码就可以了。它将EACH字符视为关键字变量的单独值...因此,如果我输入文本“one”,那么打印的是“Hello World!Hello World!Hello World!”,如果我只有“o”作为价值,打印“Hello World!”。
奇怪的是(我也想知道为什么也是这样),我真的希望该字段成为“值将从列表中选择”类型的字段,指向我在类别中的类别和关键字。当我这样做,并且myCategory的值更改为此类型字段的下拉列表中所选项目的值而不是直接文本输入时,代码不再起作用并给出此错误:
无法将类型'Tridion.Extensions.Mediators.Razor.Models.KeywordModel'隐式转换为'System.Collections.IEnumerable'。存在显式转换(您是否错过了演员?)
请帮帮我。
答案 0 :(得分:1)
如果为字符串中的每个字符重复输出输出,则显然会迭代字符串中的字符而不是您期望的其他值范围。
我快速检查了Razor介体的相关代码,其ToString
方法确实返回了基础RepositoryLocalObject
的标题。
处理DynamicItemsFields.cs
文件中的KeywordField的代码:
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.NET KeywordFieldDefinition
对象)。