имея свою часть, производный от 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;
}
}
Эти дополнительные части еще не используются, но могут быть заполнены во время создания и отображаться индивидуально с использованием файла места размещения. Это первый шаг к тому, чего я пытался достичь!
Что делает ваш _assetService.Get()? Является ли ваш актив типом контента? – devqon
Активы производятся из ContentPart. (Теоретически я могу создать ContentItem, который использует эту часть, а другие сваривают вместе). Первый этап - получение ContentPart - заполненного из внешнего источника - для показа на странице .... затем добавьте к нему другие части (в коде), чтобы он являлся элементом контента Orchard, со всеми колоколами и свистами, которые идут с этим. – GadgetGeekUK
Я не уверен, если вы можете использовать 'BuildDisplay' в одной части – devqon