在进一步探索并考虑到@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" 是我的内容类型的名称(即将我的零件焊接到的项目)。这段代码只是创建了一个PlayerSearch 类型并创建了它的一个实例,然后将其持久化。
第 2 步:内容部分
我创建了一个简单的 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 步:内容处理程序
我做的下一件事是将我的 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);
}
此操作检索我在 Migrations 文件中创建的 PlayerSearch 类型的实例,为其构建编辑器,然后将其传递给视图。
第 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 中为零件创建一个记录,以便 Orchard 知道在哪里渲染它。
此技术取自网站设置的工作方式。要查看此内容并了解 Post 操作如何工作,请查看Orchard.Core.Settings.Controllers.AdminController 的控制器。