从视图添加到区域的形状的优先级

Priority of shapes that are added to a zone from a view

我在这里没有使用 Orchard 术语,但我有一段文字我想用一个形状包裹起来。这是博客详细信息页面上的一些社交分享网址。我想保持干净所以我决定做一个新的形状。

我已经 post 编辑了下面 Content-BlogPost.Detail.cshtml 的完整列表,但我的想法是:

  1. 我做了一个cshtml来保存社交媒体标记
  2. 我在主post详细视图中准备数据
  3. 我使用 Model.Meta.Add(socialShape, "1");
  4. 创建形状并将其添加到 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");
        });
    }
}

谁能告诉我我做错了什么?

大多数形状只是按照添加它们的顺序呈现它们的子项。 ZoneContentZone 形状的区别在于在渲染子项之前调用 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 中的错误,但此解决方法应该可以解决您的问题。