Orchardcms 从不同的地方获得果园

Orchardcms 从不同的地方获得果园,orchardcms,Orchardcms,在Orchard摘要视图中,我显示的内容项可以是页面、博客帖子或投影 我在所有这些类型上都附加了一个媒体选择器字段,称之为Picture 我目前正在使用这段可怕的代码从内容项访问媒体选择器: if (contentItem != null) { try { mediaPicker = (MediaLibraryPickerField) contentItem.Blog.Picture; } catch (Exception e) {} i

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

我在所有这些类型上都附加了一个媒体选择器字段,称之为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) {}
    }
}

一定有更好的方法吗?

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

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

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

另一种方法是使用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");
var mediaPicker=(MediaLibraryPickerField)
((IEnumerable)contentItem.Parts)
.SelectMany(p=>p.Fields)
.FirstOrDefault(f=>f.Name==“图片”);

我想没有^真的吗?家伙!当我看到它的时候,我觉得很明显,这让我觉得自己很愚蠢。代码还不错。是否需要直接访问选择器字段?或者您可以使用位置来显示它吗?或者,您可以将字段附加到零件,然后从零件驱动程序访问数据并将其发送到显示器。每次我需要添加新的contentItem类型时,这些行代码中的某些内容都会变得更糟。我可以将内容项传递给@Display(contentItem),但我必须向它的alternates集合中添加一些内容,以便对其进行模板化。这只有在它是博客时才有效。页面和投影呢?我认为content.ProjectionPart.Picture和content.PagePart.Picture应该可以工作。它们可以工作,但如果它们不存在,就会抛出错误。因此,我所有的尝试都是骗局。同样的问题。也许你可以在开始的时候检查内容类型,这样你就可以避免尝试捕获。我想我输入了一个错误并更新了我的答案。请再试一次。您的打字错误更正修复了它。我刚刚在MediaLibraryPickerField中添加了一个类型转换,这是我的代码中所必需的,所以它的其余部分可以正常工作。我还添加了fluent,因为我更喜欢它。我补充了你的答案。希望没问题,酷!是的,我觉得很好。