2015-09-11 3 views
0

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

Я использую контроллер для доступа к элементу через 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, но это пустое значение, несмотря на получая мою часть из «ContentPart».

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

+0

Что делает ваш _assetService.Get()? Является ли ваш актив типом контента? – devqon

+0

Активы производятся из ContentPart. (Теоретически я могу создать ContentItem, который использует эту часть, а другие сваривают вместе). Первый этап - получение ContentPart - заполненного из внешнего источника - для показа на странице .... затем добавьте к нему другие части (в коде), чтобы он являлся элементом контента Orchard, со всеми колоколами и свистами, которые идут с этим. – GadgetGeekUK

+0

Я не уверен, если вы можете использовать 'BuildDisplay' в одной части – devqon

ответ

0

имея свою часть, производный от ContentPart, можно использовать следующий метод контроллера:

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; 
     } 
    } 

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

0

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

Для отображения одной формы, вы можете сделать следующее:

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 с Данная модель

+0

Это здорово, в идеале да, я хотел бы иметь его как элемент контента - в основном, я просто хочу, чтобы это как часть, но имея данные из внешнего источника.С точки зрения функциональности я хочу, чтобы это была часть, которую можно сварить с другими частями (предварительно подключенными к коду, например, к разделу Title, AutoRoute), чтобы сделать элемент контента – GadgetGeekUK

+0

Попытка этого метода - поиск свойства Id (из полученное из ContentPart) - которого у него нет, и не имеет сеттера ... – GadgetGeekUK

+0

где он ищет идентификатор? Я предположил, что ваш _assetService был вашей собственной реализацией – devqon

Смежные вопросы