Razor “错误”;无法隐式转换类型";访问发布元数据类别时

Razor “错误”;无法隐式转换类型";访问发布元数据类别时,razor,metadata,tridion,Razor,Metadata,Tridion,我以前也有过类似的问题,但这只是几个步骤之外的问题,所以我们现在开始: 我正在尝试访问Tridion 2011中某个类别的值。我正在使用Razor TBB,并使用以下代码执行此操作: @foreach (var keyword in Publication.MetaData.myCategory) { @: Hello World! } 我已经设置了一个元数据模式,其中一个字段的xml名称“myCategory”附加到了我的出版物上。如果我在myCategory是文本字段的出版物上运行此代

我以前也有过类似的问题,但这只是几个步骤之外的问题,所以我们现在开始:

我正在尝试访问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”。存在显式转换(是否缺少强制转换?)


请帮助我。

如果对字符串中的每个字符重复输出,则显然是在字符串中的字符上迭代,而不是在预期的其他值范围内迭代

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

处理
dynamictemsfields.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;
    }
}
else if(itemField是关键字字段)
{
关键字字段关键字字段=(关键字字段)项目字段;
if(keywordField.Definition.MaxOccurs==1)
if(keywordField.Value==null)
_字典[键]=空;
其他的
_dictionary[key]=新的关键字模型(_engine,keywordField.Value);
其他的
{
列表关键字=新列表();
int i=0;
foreach(keywordField.Values中的关键字k)
{
var kw=新关键字模型(_引擎,k);
千瓦指数=i++;
kw.IsLast=Index==keywordField.Values.Count-1;
关键词:添加(千瓦);
}
_字典[键]=关键字;
}
}
因此,
myCategory
属性可能是一个KeywordModel对象(如果KeywordField为单值)或
列表(如果KeywordField在架构中标记为多值)。您的
myCategory
字段是否为单一值?还是多重价值


如果它是单值的,您期望的输出类型是什么?如果您希望看到允许值列表(而不是当前选择的),请检查您是否可以通过
myCategory.Definition
以某种方式访问它(它应该是一个常规的TOM.NET
关键字字段定义
对象)。

它被标记为单个值。在关键字变量末尾调用ToString()似乎已经解决了问题。这段代码返回该项的值,但我的Hello World测试仍然表明,尽管它现在可以工作,但它仍在遍历每个字符,然后在最后将它们组合起来。谢谢你,虽然这一部分现在起作用了,我离它又近了一步!由于您的
myCategory
是单值,因此您的代码将迭代字符串中的字符。这里没有什么问题,它完全按照你的吩咐去做。似乎您希望迭代类别中允许的关键字,在这种情况下,您应该遵循myCategory上的
定义
属性并从那里开始工作。看看TOM.NETAPI文档,当我刚刚检查它们时,它们看起来非常清晰。