2

以前にも同様の質問がありましたが、これはそれよりも数ステップ進んでいるので、ここに進みます。

Tridion 2011 のカテゴリの値にアクセスしようとしています。Razor TBB を使用しており、次のコードを使用してアクセスしています。

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

パブリケーションに添付された「myCategory」という xml 名を持つフィールドを持つメタデータ スキーマを設定しました。myCategory が Text フィールドであるパブリケーションでこれを実行すると、このコードは機能します... のようなものです。各文字をキーワード変数の個別の値として扱います...したがって、テキスト「one」を入力すると、「Hello World! Hello World! Hello World!」と出力されます。値を指定すると、「Hello World!」が出力されます。

それは奇妙です(そしてその理由も知りたいのですが)、フィールドを「リストから値が選択される」タイプのフィールドにして、カテゴリとキーワードのカテゴリを指すようにしたいのです。これを行うと、myCategory の値が直接テキスト入力ではなく、このタイプのフィールドのドロップダウンで選択された項目の値に変更され、コードが機能しなくなり、次のエラーが発生します。

タイプ 'Tridion.Extensions.Mediators.Razor.Models.KeywordModel' を 'System.Collections.IEnumerable' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

私を助けてください。

4

1 に答える 1

1

文字列内のすべての文字に対して出力が繰り返される場合、文字列内の文字を繰り返し処理していることは明らかであり、期待した他の値の範囲ではありません。

Razor メディエーターの関連コードをすばやく確認したところ、その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

ファイル内の KeywordFields を処理するコード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 がスキーマで複数値としてマークされている場合) のいずれかになります。あなたのmyCategoryフィールドは単一の値ですか? それとも多値?

単一値の場合、どのタイプの出力を期待していましたか? (現在選択されている値ではなく)許可された値のリストを期待していた場合は、何らかの形でアクセスできるかどうかを確認してください(これは通常の TOM.NETオブジェクトである必要があります)。myCategory.DefinitionKeywordFieldDefinition

于 2012-06-26T16:59:40.450 に答える