2

Orchard の概要ビューで、ページ、ブログ投稿、またはプロジェクションのコンテンツ アイテムを表示しています。

これらすべてのタイプに Media Picker フィールドを追加し、Picture と呼びました。

私は現在、この恐ろしいコードを使用して、コンテンツ アイテムからメディア ピッカーにアクセスしています。

if (contentItem != null)
{
    try
    {
        mediaPicker = (MediaLibraryPickerField) contentItem.Blog.Picture;
    }
    catch (Exception e) {}

    if (mediaPicker == null)
    {
        try
        {
            mediaPicker = (MediaLibraryPickerField)
                            contentItem.Page.Picture;
        }
        catch (Exception e) {}
    }

    if(mediaPicker == null)
    {
        try
        {
            mediaPicker = (MediaLibraryPickerField) contentItem.ProjectionPage.Picture;
        }
        catch (Exception e) {}
    }
}

もっと良い方法があるはずですか?

4

2 に答える 2

5

もう 1 つの方法は、Linq を使用することです。

var mediaPicker = (MediaLibraryPickerField)
                 (from part in ((ContentItem)contentItem).Parts
                  from field in part.Fields
                  where field.Name == "Picture"
                  select field).FirstOrDefault();

これはクリーンで、Picture フィールドを持つ将来の新しいタイプで機能します。

流暢な同等物は次のとおりです。

var mediaPicker = (MediaLibraryPickerField)
            ((IEnumerable<ContentPart>)contentItem.Parts)
            .SelectMany(p => p.Fields)
            .FirstOrDefault(f => f.Name == "Picture");
于 2013-08-30T00:52:32.273 に答える
2

テンプレートで行うように、アイテムを動的にキャストしてフィールドにアクセスできます

dynamic content = (dynamic)contentItem;
var mediaPicker = content.BlogPart.Picture;

これで、mediaPicker にフィールドができました。欠点の 1 つは、IntelliSense が失われることです。フィールドが存在しない場合、mediaPicker は null だと思います。

于 2013-08-29T14:13:49.463 に答える