【问题标题】:Getting Orchard fields from different parts从不同部分获取果园田地
【发布时间】:2013-08-29 13:18:53
【问题描述】:

在 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) {}
    }
}

一定有更好的办法吗?

【问题讨论】:

  • 我不认为有^_^
  • 真的吗?混蛋!我以为这是显而易见的事情,当我看到它时让我感到很愚蠢。
  • 代码还不错。您需要直接访问选择器字段吗?或者您可以使用展示位置来显示它吗?或者您可以将您的字段附加到零件,然后从零件驱动程序访问数据并将其发送到您的显示器。类似的东西
  • 每次我需要添加新的 contentItem 类型时,代码都会变得更糟。我可以将内容项传递给@Display(contentItem),但我必须在其备用集合中添加一些内容,以便我可以对其进行模板化。

标签: orchardcms


【解决方案1】:

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

【讨论】:

  • 我想我打错了,更新了我的答案。请重试。
  • 您的错字更正修正了它。我刚刚向 MediaLibraryPickerField 添加了一个类型转换,这是我的代码所必需的,因此其余部分可以正常工作。我还添加了流利的等效项,因为我更喜欢这样。我添加到你的答案。希望没问题。
  • 酷!是的,我完全没问题。
【解决方案2】:

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

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

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

【讨论】:

  • 只有当它是一个博客时才有效。页面和投影呢?
  • 我认为 content.ProjectionPart.Picture 和 content.PagePart.Picture 应该可以工作。
  • 他们有,但如果他们不存在,他们会抛出一个错误。因此,我所有的尝试都是恶作剧。
  • 同样的问题。也许您可以在开始时检查内容类型,这样您就可以避免尝试捕获。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多