获取 Orchard 中自定义部分的媒体选择器字段内容

Get media picker field content of a custom part in Orchard

我使用内容选择器字段创建了自定义部分。

public int UpdateFrom1()
    {
        ContentDefinitionManager.AlterPartDefinition("BackgroundPart",
            builder => builder.WithField("BackgroundImage",
                fieldBuilder => fieldBuilder
                    .OfType("MediaPickerField")
                    .WithDisplayName("Background Image")));

        return 2;
    }

    public int UpdateFrom2()
    {
        ContentDefinitionManager.AlterTypeDefinition("Background", cfg => cfg             
          .WithPart("BackgroundPart")
          .Creatable()
          .Indexed());
        return 3;
    }

获取数据的服务代码:

public class BackgroundService : IBackgroundService
{       
    private readonly IRepository<BackgroundPartRecord> _repository;

    public BackgroundService(
        IRepository<BackgroundPartRecord> repository,
        ISignals signals)
    {
        _repository = repository;           
    }

    public IEnumerable<BackgroundPartRecord> Get()
    {
        return _repository.Table;
    }       
}

这有效(我可以在创建此类新项目时选择内容)。

现在我想获取我的类型的所有项目的列表。我为此创建了一项服务,并获得了我创建的项目的列表。但是列表中的项目没有媒体选择器字段。我如何获得此内容?我想在我的模块中的 FilterProvider class 的 OnResultExecuting 方法中使用它。

这行不通,因为您正在使用存储库 API。 Repository 是内部使用的低级 API,但如果被模块使用的话,应该很少使用。原因之一是它不会获取内容项,只是部分记录。

相反,您需要使用来自 ContentManager 的查询 API 之一。这将为您提供真正的内容项,您可以对其执行 As,这将使您能够访问内容项的字段(这些字段存储在内容项记录中的信息集中)等

这个或重载和扩展方法之一应该可以解决问题:

_contentManager.Query<BackgroundPart>()