Orchardcms 将目标参数添加到Orchard CMS中的自定义链接菜单项

Orchardcms 将目标参数添加到Orchard CMS中的自定义链接菜单项,orchardcms,orchardcms-1.8,Orchardcms,Orchardcms 1.8,我在Orchard中创建了导航菜单,使用了内容项和自定义链接元素(网站的部分内容不在CMS范围内)。现在我需要在新窗口/选项卡中打开几个链接,基本上是target=“\u blank”行为 由于原始的自定义链接没有任何参数,我尝试创建它的扩展版本。在管理后端,我转到“内容定义”查找自定义链接,并尝试创建它的副本,然后添加一个目标字段,我可以在主题的菜单.cshtml文件中检查并使用该字段 然而,我甚至无法让自定义链接的基本复写件正常工作。它与原始的自定义链接具有相同的原型、相同的部分和相同的形式

我在Orchard中创建了导航菜单,使用了
内容项
自定义链接
元素(网站的部分内容不在CMS范围内)。现在我需要在新窗口/选项卡中打开几个链接,基本上是
target=“\u blank”
行为

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

然而,我甚至无法让
自定义链接的基本复写件正常工作。它与原始的
自定义链接
具有相同的原型、相同的部分和相同的形式(无),并且它确实出现在管理->导航窗口的项目列表中。但是,该项没有URL/链接的字段。它只有菜单文本字段,没有其他字段

所以我的问题是两层的:

  • 如何在我的Orchard后端导航中获得
    自定义链接
    项目类型的副本
  • 当我的
    自定义链接副本
    工作并添加名为
    目标
    的文本字段时,如何在
    菜单.cshtml
    视图中访问其值
  • (我试着简单地在我的副本中添加一个URL字段,该字段将显示在导航编辑器中,但是导航本身将在输出中忽略它,并创建一个指向内容项id的链接)

    非常感谢您的帮助

    编辑:这里是,也许他们可以帮助确定问题

  • 看起来你做的一切都对。请仔细检查是否有
    MenuItemPart
    。此部分负责保存URL信息并显示其编辑器。但不确定此部件是否可附加-如果不可附加,则在
    Content Definition\Parts
    窗格中进行附加

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


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

    这很好:

    AdvancedMenuItemPartRecord:

    public class AdvancedMenuItemPartRecord : ContentPartRecord
    {
        public virtual string Target { get; set; }
        public virtual string Classes { get; set; }
    }
    
    高级菜单技术:

    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); }
        }
    }
    
    }
    @Html.Raw(tag.ToString(TagRenderMode.Normal))

    谢谢您的回答。我不太明白你说的
    MenuItemPart
    是什么意思。为了更好地说明这个问题,我在我的Orchard后端添加了几个截图的链接,也许你可以在那里发现错误?至少在我看来,它应该会起作用,但我可能遗漏了一些东西。
    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);
        }
    }
    
    public class AdvancedMenuItemPartHandler : ContentHandler
    {
        public AdvancedMenuItemPartHandler(IRepository<AdvancedMenuItemPartRecord> repository)
        {
            Filters.Add(StorageFilter.For(repository));
            Filters.Add(new ActivatingFilter<MenuItemPart>("AdvancedMenuItem"));
        }
    }
    
    <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;
        }
    
    @{
       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);
       }