【问题标题】:How can I weld part to an admin page in Orchard CMS如何将零件焊接到 Orchard CMS 中的管理页面
【发布时间】:2013-05-30 16:43:22
【问题描述】:

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

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: c# orchardcms


    【解决方案1】:

    在进一步探索并考虑到@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 的控制器。

    【讨论】:

      【解决方案2】:

      您不能将任何东西焊接到自定义页面上 - 它不能像这样工作。

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

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

      【讨论】:

        猜你喜欢
        • 2013-11-06
        • 2016-02-11
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多