在进一步探索并考虑到@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);
}
此操作检索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
的部件中有一条记录,以便 Orchard 知道在哪里渲染它。
这种技术取自站点设置的工作方式。看看这个,看看 Post 动作是如何工作的,看看控制器在Orchard.Core.Settings.Controllers.AdminController
.