从视图添加到区域的形状的优先级
Priority of shapes that are added to a zone from a view
我在这里没有使用 Orchard 术语,但我有一段文字我想用一个形状包裹起来。这是博客详细信息页面上的一些社交分享网址。我想保持干净所以我决定做一个新的形状。
我已经 post 编辑了下面 Content-BlogPost.Detail.cshtml
的完整列表,但我的想法是:
- 我做了一个
cshtml
来保存社交媒体标记
- 我在主post详细视图中准备数据
- 我使用
Model.Meta.Add(socialShape, "1");
创建形状并将其添加到 Meta
区域(这是一个不同于元描述的本地区域)
形状已按预期添加,但第二个参数(优先级)不起作用。它必须是一个字符串,传递 int
会中断页面。 Meta
区域中其他项目的默认优先级为 5,因此它应该放在顶部但它总是在最后结束。
// Model.Meta.Add works but the priority seems to be ignored?
@using Orchard.ContentManagement;
@using Orchard.Utility.Extensions
@using Orchard.Blogs.Models
@functions{
void AddSocialMediaShareLinks() {
var socialShareUrl = new Uri(new Uri(WorkContext.CurrentSite.BaseUrl), Url.ItemDisplayUrl((IContent)Model.ContentItem)).ToString();
var socialShareTitle = Model.ContentItem.Title;
var socialShape = New.BlogPost_SocialMediaShareLinks(ShareUrl: socialShareUrl, ShareTitle: socialShareTitle);
Model.Meta.Add(socialShape, "1");
}
}
@{
if (Model.Title != null) {
Layout.Title = Model.Title;
}
BlogPart parentBlog = Model.Blog;
IContent contentItem = Model.ContentItem;
var contentTypeClassName = ((string)Model.ContentItem.ContentType).HtmlClassify();
AddSocialMediaShareLinks();
Model.Classes.Add("content-item");
Model.Classes.Add(contentTypeClassName);
var tag = Tag(Model, "article");
}
@tag.StartElement
<header>
@Display(Model.Header)
</header>
<div class="row row-blog-content">
<div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
@if (Model.Meta != null) {
<div class="metadata">
@Display(Model.Meta)
</div>
}
@Display(Model.Content)
</div>
</div>
<div class="row row-blog-return-parent">
<div class="col-sm-12">
<p class="text-center"><a href="@Url.ItemDisplayUrl(parentBlog)" class="btn btn-default">@T("Go back to the news")</a></p>
</div>
</div>
@if (Model.Footer != null) {
<footer>
@Display(Model.Footer)
</footer>
}
@tag.EndElement
阅读一些文章后,我发现旧 post 是 Bertrand post 关于 customizing the first item template。
我想也许我将它添加到区域的位置在这个过程中为时已晚,所以我将代码更改为下面的代码片段,但是 Model.Meta.Add
在这种情况下永远不会被击中:
@functions{
void AddSocialMediaShareLinks() {
var socialShareUrl = new Uri(new Uri(WorkContext.CurrentSite.BaseUrl), Url.ItemDisplayUrl((IContent)Model.ContentItem)).ToString();
var socialShareTitle = Model.ContentItem.Title;
var socialShape = New.BlogPost_SocialMediaShareLinks(ShareUrl: socialShareUrl, ShareTitle: socialShareTitle);
ShapeMetadata metadata = Model.Metadata;
metadata.OnDisplaying(ctx => {
Model.Meta.Add(socialShape, "1");
});
}
}
谁能告诉我我做错了什么?
大多数形状只是按照添加它们的顺序呈现它们的子项。 Zone
和 ContentZone
形状的区别在于在渲染子项之前调用 Order
:
[Shape]
public void Zone(dynamic Display, dynamic Shape, TextWriter Output) {
string id = Shape.Id;
IEnumerable<string> classes = Shape.Classes;
IDictionary<string, string> attributes = Shape.Attributes;
var zoneWrapper = GetTagBuilder("div", id, classes, attributes);
Output.Write(zoneWrapper.ToString(TagRenderMode.StartTag));
foreach (var item in Order(Shape))
Output.Write(Display(item));
Output.Write(zoneWrapper.ToString(TagRenderMode.EndTag));
}
您也可以通过从模板或形状方法代码中调用 Order
,在您自己的形状中获得相同的效果。
要启用排序,您应该将 Tab
属性 添加到形状 Metadata
中,如下所示:
socialShape.Metadata.Tab = "";
Model.Meta.Add(socialShape, "1");
这将禁用 ContentZone
内的形状分组。
我认为这是 Orchard 中的错误,但此解决方法应该可以解决您的问题。
我在这里没有使用 Orchard 术语,但我有一段文字我想用一个形状包裹起来。这是博客详细信息页面上的一些社交分享网址。我想保持干净所以我决定做一个新的形状。
我已经 post 编辑了下面 Content-BlogPost.Detail.cshtml
的完整列表,但我的想法是:
- 我做了一个
cshtml
来保存社交媒体标记 - 我在主post详细视图中准备数据
- 我使用
Model.Meta.Add(socialShape, "1");
创建形状并将其添加到
Meta
区域(这是一个不同于元描述的本地区域)
形状已按预期添加,但第二个参数(优先级)不起作用。它必须是一个字符串,传递 int
会中断页面。 Meta
区域中其他项目的默认优先级为 5,因此它应该放在顶部但它总是在最后结束。
// Model.Meta.Add works but the priority seems to be ignored?
@using Orchard.ContentManagement;
@using Orchard.Utility.Extensions
@using Orchard.Blogs.Models
@functions{
void AddSocialMediaShareLinks() {
var socialShareUrl = new Uri(new Uri(WorkContext.CurrentSite.BaseUrl), Url.ItemDisplayUrl((IContent)Model.ContentItem)).ToString();
var socialShareTitle = Model.ContentItem.Title;
var socialShape = New.BlogPost_SocialMediaShareLinks(ShareUrl: socialShareUrl, ShareTitle: socialShareTitle);
Model.Meta.Add(socialShape, "1");
}
}
@{
if (Model.Title != null) {
Layout.Title = Model.Title;
}
BlogPart parentBlog = Model.Blog;
IContent contentItem = Model.ContentItem;
var contentTypeClassName = ((string)Model.ContentItem.ContentType).HtmlClassify();
AddSocialMediaShareLinks();
Model.Classes.Add("content-item");
Model.Classes.Add(contentTypeClassName);
var tag = Tag(Model, "article");
}
@tag.StartElement
<header>
@Display(Model.Header)
</header>
<div class="row row-blog-content">
<div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
@if (Model.Meta != null) {
<div class="metadata">
@Display(Model.Meta)
</div>
}
@Display(Model.Content)
</div>
</div>
<div class="row row-blog-return-parent">
<div class="col-sm-12">
<p class="text-center"><a href="@Url.ItemDisplayUrl(parentBlog)" class="btn btn-default">@T("Go back to the news")</a></p>
</div>
</div>
@if (Model.Footer != null) {
<footer>
@Display(Model.Footer)
</footer>
}
@tag.EndElement
阅读一些文章后,我发现旧 post 是 Bertrand post 关于 customizing the first item template。
我想也许我将它添加到区域的位置在这个过程中为时已晚,所以我将代码更改为下面的代码片段,但是 Model.Meta.Add
在这种情况下永远不会被击中:
@functions{
void AddSocialMediaShareLinks() {
var socialShareUrl = new Uri(new Uri(WorkContext.CurrentSite.BaseUrl), Url.ItemDisplayUrl((IContent)Model.ContentItem)).ToString();
var socialShareTitle = Model.ContentItem.Title;
var socialShape = New.BlogPost_SocialMediaShareLinks(ShareUrl: socialShareUrl, ShareTitle: socialShareTitle);
ShapeMetadata metadata = Model.Metadata;
metadata.OnDisplaying(ctx => {
Model.Meta.Add(socialShape, "1");
});
}
}
谁能告诉我我做错了什么?
大多数形状只是按照添加它们的顺序呈现它们的子项。 Zone
和 ContentZone
形状的区别在于在渲染子项之前调用 Order
:
[Shape]
public void Zone(dynamic Display, dynamic Shape, TextWriter Output) {
string id = Shape.Id;
IEnumerable<string> classes = Shape.Classes;
IDictionary<string, string> attributes = Shape.Attributes;
var zoneWrapper = GetTagBuilder("div", id, classes, attributes);
Output.Write(zoneWrapper.ToString(TagRenderMode.StartTag));
foreach (var item in Order(Shape))
Output.Write(Display(item));
Output.Write(zoneWrapper.ToString(TagRenderMode.EndTag));
}
您也可以通过从模板或形状方法代码中调用 Order
,在您自己的形状中获得相同的效果。
要启用排序,您应该将 Tab
属性 添加到形状 Metadata
中,如下所示:
socialShape.Metadata.Tab = "";
Model.Meta.Add(socialShape, "1");
这将禁用 ContentZone
内的形状分组。
我认为这是 Orchard 中的错误,但此解决方法应该可以解决您的问题。