Изучив дальнейшие и с учетом превосходного ответа @ Piotr, мне удалось добиться того, что я хотел сделать.
Шаг 1: Миграции
private readonly IOrchardServices _services;
public Migrations(IOrchardServices services) {
_services = services;
}
public int Create()
{
ContentDefinitionManager.AlterTypeDefinition("PlayerSearch", cfg => { });
var content = _services.ContentManager.New("PlayerSearch");
_services.ContentManager.Create(content);
return 1;
}
В приведенном выше примере, "PlayerSearch"
это имя моего типа контента (то есть элемент I будет сварка мои части к). Этот код просто создает тип PlayerSearch
и создает один экземпляр его, который затем сохраняется.
Шаг 2: ContentPart
Я создал простой класс POCO как ContentPart
. Это то, что я хочу, чтобы сварить на мою страницу PlayerSearch:
public class PlayerSearchPart : ContentPart
{
public string String1 { get; set; }
public string String2 { get; set; }
public string String3 { get; set; }
public int Int1 { get; set; }
public int Int2 { get; set; }
public int Int3 { get; set; }
}
Шаг 3: ContentHandler
Следующая вещь, которую я сделал, было сварить мой PlayerSearchPart
к моему PlayerSearch
типа, как это определено в миграции:
public class PlayerSearchHandler : ContentHandler
{
public PlayerSearchHandler()
{
Filters.Add(new ActivatingFilter<PlayerSearchPart>("PlayerSearch"));
}
}
Я сделал это в ContentHandler с помощью ActivatingFilter
.
Шаг 4: Контроллер
Теперь нам нужно создать страницу на экранах администратора, который способен отображать все сваренные части к пользователю:
private readonly IOrchardServices _services;
public PlayerManagementController(IOrchardServices services) {
_services = services;
}
[HttpGet]
public ActionResult PlayerSearch()
{
var playerSearchType = _services.ContentManager.Query().ForType(new[] {"PlayerSearch"}).Slice(0, 1).FirstOrDefault();
var model = _services.ContentManager.BuildEditor(playerSearchType);
// Casting to avoid invalid (under medium trust) reflection over the protected View method and force a static invocation.
return View((object)model);
}
Это действие извлекающего экземпляр моего типа PlayerSearch
, который я создал в файле Migrations, строит для него редактор, а затем передает его в представление.
Шаг 5: взгляд
Наши действия, конечно, нуждается в представлении, и это довольно просто, как только вы знаете, как:
@using (Html.BeginFormAntiForgeryPost()) {
@Html.ValidationSummary()
@Display(Model.Content)
<fieldset>
<button class="primaryAction" type="submit">@T("Save")</button>
</fieldset>
}
Шаг 6: Драйвер
Здесь нет ничего необычного:
// GET
protected override DriverResult Editor(PlayerSearchPart part, dynamic shapeHelper)
{
return ContentShape("Parts_PlayerSearch_Edit",
() => shapeHelper.EditorTemplate(
TemplateName: "Parts/PlayerSearch",
Model: part,
Prefix: Prefix));
}
// POST
protected override DriverResult Editor(PlayerSearchPart part, IUpdateModel updater, dynamic shapeHelper)
{
updater.TryUpdateModel(part, Prefix, null, null);
return Editor(part, shapeHelper);
}
Шаг 7: Отображение редактора для вашей части
Последний шаг заключается в создании шаблона редактора для вашей части, а также гарантировать, что у вас есть запись в вашем placement.info
для части, так что сад знает, где это сделать.
Эта техника была взята из того, как работают настройки сайта. Чтобы посмотреть на это и посмотреть, как работает Post action, посмотрите на контроллер по адресу Orchard.Core.Settings.Controllers.AdminController
.