【问题标题】:Adding the target parameter to the Custom Link MenuItem in Orchard CMS将目标参数添加到 Orchard CMS 中的自定义链接菜单项
【发布时间】:2019-01-16 21:02:05
【问题描述】:

我在 Orchard 中使用 Content ItemCustom Link 元素的组合创建了我的导航菜单(网站的部分内容超出了 CMS 的范围)。现在有几个链接需要在新窗口/标签中打开,基本上是 target="_blank" 行为。

由于原来的Custom Link 没有任何参数,我尝试创建它的扩展版本。在管理后端,我转到“内容定义”查找 Custom Link 并尝试创建它的副本,然后添加一个 target 字段,我可以在主题的 Menu.cshtml 文件中检查并使用它。

但是,我什至无法让Custom Link 项目的基本复本工作。它与原始Custom Link 具有相同的构造型、相同的部件、相同的表单(无),并且确实出现在管理-> 导航窗口的项目列表中。但是,该项目没有 URL/链接的字段。它只有菜单文本字段,没有别的。

所以我的问题是 2 层的:

  1. 如何在我的 Orchard 后端导航中获取 Custom Link 项目类型的副本?
  2. 当我的 Custom Link 副本正常工作并添加一个名为 target 的文本字段时,如何在 Menu.cshtml 视图中访问其值?

(我尝试简单地在我的副本中添加一个 URL 字段,然后它会显示在导航编辑器中,但是导航本身会在输出中忽略它并创建指向内容项 ID 的链接)。

非常感谢任何帮助!

编辑:这里是some screenshots to better illustrate the problem,也许他们可以帮助确定问题。

【问题讨论】:

    标签: orchardcms orchardcms-1.8


    【解决方案1】:
    1. 看起来你做的一切都是正确的。请仔细检查MenuItemPart 是否存在。这部分负责保存 URL 信息并为其显示一个编辑器。不确定这部分是否可附加 - 如果不是,请在 Content Definition\Parts 窗格中设置。

    2. 您应该创建一个名为 MenuItemLink-[YourTypeName].cshtml 的文件,而不是硬连线 Menu.cshtml。此形状文件将用于显示您的自定义菜单项。然后您可以通过Model.Content 对象访问任何字段,例如。 Model.Content.YourTypeName.FieldWithTargetName.Value.

    【讨论】:

    • 感谢您的回答。我不完全理解你对MenuItemPart 的意思。我添加了一个链接,指向我的 Orchard 后端的几个屏幕截图,以更好地说明问题,也许您可​​以在那里发现错误?至少在我看来它应该可以工作,但我可能会遗漏一些东西。
    【解决方案2】:

    您需要使用 MenuItemPart,因为它具有集成到 Orchard.Core 中的一些重要功能。

    这很好用:

    AdvancedMenuItemPartRecord:

    public class AdvancedMenuItemPartRecord : ContentPartRecord
    {
        public virtual string Target { get; set; }
        public virtual string Classes { get; set; }
    }
    

    AdvancedMenuItemPart:

    public class AdvancedMenuItemPart : ContentPart<AdvancedMenuItemPartRecord>
    {
        public string Target
        {
            get { return Retrieve(x => x.Target); }
            set { Store(x => x.Target, value); }
        }
        public string Classes
        {
            get { return Retrieve(x => x.Classes); }
            set { Store(x => x.Classes, value); }
        }
    }
    

    AdvancedMenuItemPartDriver:

    public class AdvancedMenuItemPartDriver : ContentPartDriver<AdvancedMenuItemPart>
    {
        protected override string Prefix
        {
            get { return "AdvancedMenuItem"; }
        }
    
        protected override DriverResult Editor(AdvancedMenuItemPart part, dynamic shapeHelper)
        {
            return ContentShape("Parts_AdvancedMenuItem_Edit", () => shapeHelper.EditorTemplate(TemplateName: "Parts/AdvancedMenuItem", Model: part, Prefix: Prefix));
        }
    
        protected override DriverResult Editor(AdvancedMenuItemPart part, IUpdateModel updater, dynamic shapeHelper)
        {
            updater.TryUpdateModel(part, Prefix, null, null);
            return Editor(part, shapeHelper);
        }
    }
    

    AdvancedMenuItemPartHandler(ActivatingFilter 将 MenuItemPart 动态添加到您的 AdvancedMenuItem):

    public class AdvancedMenuItemPartHandler : ContentHandler
    {
        public AdvancedMenuItemPartHandler(IRepository<AdvancedMenuItemPartRecord> repository)
        {
            Filters.Add(StorageFilter.For(repository));
            Filters.Add(new ActivatingFilter<MenuItemPart>("AdvancedMenuItem"));
        }
    }
    

    Placement.info:

    <Place Parts_AdvancedMenuItem_Edit="Content:11"/>
    

    迁移:

    public int UpdateFrom2()
        {
            SchemaBuilder.CreateTable("AdvancedMenuItemPartRecord",
                table => table
                    .ContentPartRecord()
                    .Column<string>("Target")
                    .Column<string>("Classes")
                );
            ContentDefinitionManager.AlterPartDefinition("AdvancedMenuItemPart", part => part
                .WithDescription(""));
    
            ContentDefinitionManager.AlterTypeDefinition("AdvancedMenuItem", cfg => cfg
                           .WithPart("AdvancedMenuItemPart")
                           .WithPart("MenuPart")
                           .WithPart("CommonPart")
                           .WithIdentity()
                           .DisplayedAs("Custom Link Advanced")
                           .WithSetting("Description", "Custom Link with target and classes fields")
                           .WithSetting("Stereotype", "MenuItem")
                // We don't want our menu items to be draftable
                .Draftable(false)
    
                // We don't want the user to be able to create new ActionLink items outside of the context of a menu
                .Creatable(false)
            );
    
            return 3;
        }
    

    MenuItemLink-AdvancedMenuItem.cshtml:

    @{
       var advancedPart = Model.Content.AdvancedMenuItemPart;
    
       var tag = new TagBuilder("a");
       tag.InnerHtml = WebUtility.HtmlDecode(Model.Text.Text);
       tag.MergeAttribute("href", Model.Href);
    
       if (!string.IsNullOrWhiteSpace(advancedPart.Target)) {
           tag.MergeAttribute("target", advancedPart.Target);
       }
       if (!string.IsNullOrWhiteSpace(advancedPart.Classes))
       {
           tag.AddCssClass(advancedPart.Classes);
       }
    

    } @Html.Raw(tag.ToString(TagRenderMode.Normal))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多