Orchard CMS: создание элементов содержимого из внешнего источника данных

В Orchard CMS у меня есть служба, которая извлекает данные из внешнего источника данных и загружает данные в часть содержимого Orchard. Часть имеет миграцию, которая соединяет ее с титульной частью, и у меня есть маршрут, по которому мой контроллер получает доступ через URL:

Я использую контроллер для доступа к элементу через URL, так же, как контроллер части блога. Однако я не могу сделать свою часть... Контроллер блога делает следующее:

    var asset = _assetService.Get(1234);
    if (asset == null) return HttpNotFound();

    var model = _services.ContentManager.BuildDisplay(asset); 

    return new ShapeResult(this, model);

Но если я сделаю это, метод 'BuildDisplay' будет искать asset.ContentItem, но это будет нулевым, несмотря на то, что я извлекаю свою часть из Content Part.

Что мне нужно сделать, чтобы мои данные отображались?

2 ответа

Решение

Получив свою часть от ContentPart, я могу использовать следующий метод Controller:

private readonly IAssetService _assetService;
private readonly IOrchardServices _services;

public MyController(IShapeFactory shapeFactory, IAssetService assetService, IOrchardServices services) {
    _assetService = assetService;
    _services = services;
    Shape = shapeFactory;
}

public dynamic Shape { get; set; }

public ActionResult MyAction(int assetId) {
    var asset = _assetService.Get(1234);
    if (asset == null) return HttpNotFound();

    // this method assumes you have a view called Parts.Asset.cshtml (see the AssetPartDriver)
    var model = _services.ContentManager.New("Asset");
    var item = contentItem.As<AssetPart>();
    item.Populate(asset) // Method that just populates the service loaded object into the ContentPart

    return new ShapeResult(this, _services.ContentManager.BuildDisplay(item));
}

Это будет использовать "AssetPartDriver":

public class AssetPartDriver : ContentPartDriver<AssetPart>
    {
        protected override DriverResult Display(AssetPart part, string displayType, dynamic shapeHelper)
        {
            return ContentShape("Parts_Asset", () => shapeHelper.Parts_Asset()); // Uses Parts.Asset.cshtml
        }
    }

И вместе с файлом "Placement.info" отображается на экране:

<Placement>
  <Match ContentType="Asset">
    <Match DisplayType="Detail">
      <Place Parts_Asset="Content"/>
    </Match>
  </Match>
</Placement>

Файл миграции объединяет мою часть веб-сервиса с другими частями Orchard:

public class Migrations : DataMigrationImpl
    {
        public int Create()
        {
            ContentDefinitionManager.AlterTypeDefinition("Asset", cfg => cfg
                .WithPart("AssetPart")
                .WithPart("AutoroutePart", builder => builder
                    .WithSetting("AutorouteSettings.AllowCustomPattern", "True"))
                .Listable()
                .Securable()
                .Creatable(false));

            ContentDefinitionManager.AlterPartDefinition("AssetPart", part => part
                .WithDescription("A part that contains details of an individual Web Service loaded asset."));
            return 1;
        }
    }

Эти дополнительные части еще не используются, но могут быть заполнены во время создания и отображены отдельно с использованием файла размещения. Это первый шаг к тому, чего я пытался достичь!!

Если я правильно понимаю, вы пытаетесь отобразить только одну часть, а не весь элемент контента.

Чтобы отобразить одну фигуру, вы можете сделать следующее:

private readonly IAssetService _assetService;

public MyController(IShapeFactory shapeFactory, IAssetService assetService) {
    _assetService = assetService;
    Shape = shapeFactory;
}

public dynamic Shape { get; set; }

public ActionResult MyAction(int assetId) {
    var asset = _assetService.Get(1234);
    if (asset == null) return HttpNotFound();

    // the shape factory can call any shape (.cshtml) that is defined
    // this method assumes you have a view called SomeShapeName.cshtml
    var model = Shape.SomeShapeName(asset);

    return new ShapeResult(this, model);
}

!! Примечание: это не пинает (дисплей) драйвер детали, он только возвращает.cshtml с данной моделью

Другие вопросы по тегам