如何将零件焊接到Orchard CMS中的管理页面

时间:2013-05-30 16:43:23

标签: c# orchardcms

在Orchard CMS中,我可以使用Filters.Add(new ActivatingFilter<TermsAndConditionSettingsPart>("Site"));创建一个零件并将其焊接到网站,并让该部分的编辑器显示在网站设置中。

我的管理界面中还有一些页面,我使用了控制器和操作来允许用户编辑模块的设置。

我想知道如何将零件焊接到我的一个自定义管理页面上。我想我需要做一些类似于上面提到的代码的事情,但我不太确定我应该焊接到什么地方(即 - 我应该用什么替换“Site”)?我是否需要为每个管理页面创建内容类型?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

在进一步探索并考虑到@ 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步: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"));
    }
}

我使用ActivatingFilter在ContentHandler中完成了此操作。

第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类型的实例,为其构建编辑器,然后将其传递给视图。

第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处的控制器。

答案 1 :(得分:3)

您无法将任何内容焊接到自定义页面上 - 它不会像这样工作。

零件被焊接到内容项上,例如SiteSite与其他内容项目没有什么不同,例如UserPage等,但有一个例外 - 每个租户总有一个Site项。当您转到设置中的任何部分时,您实际看到的是该项目的编辑器(并且每个部分显示该编辑器中与命名组对应的部分)。此功能仅适用于Site个项目。

如果您需要全站设置,最好的方法是始终将零件焊接到Site项目上。然后,您可以在自定义视图中提供指向该特定编辑器的链接(或选项卡等)。