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