从不同的部分获取Orchard字段

时间:2013-08-29 13:18:54

标签: orchardcms

在Orchard摘要视图中,我显示的内容项可能是Page,Blog Post或Projection。

我已将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) {}
    }
}

必须有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

另一种方法是使用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");

答案 1 :(得分:2)

您可以将项目转换为动态并像访问模板一样访问字段

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

现在你在mediaPicker上有了这个字段。一个缺点是你失去了IntelliSense。如果该字段不存在,我认为mediaPicker为空。