2

在 Orchard 摘要视图中,我显示的内容项可以是页面、博客文章或投影。

我为所有这些类型附加了一个媒体选择器字段并将其命名为图片。

我目前正在使用这段可怕的代码从内容项中访问媒体选择器:

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

另一种方法是使用 Linq:

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

它很干净,适用于具有图片字段的未来新类型。

这是流利的等价物:

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 上有了字段。一个缺点是您失去了 IntelliSense。如果该字段不存在,我认为 mediaPicker 为空。

于 2013-08-29T14:13:49.463 回答