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

Orchardcms 从视图添加到分区的形状的优先级,orchardcms,Orchardcms,我在这里没有使用Orchard术语,但我有一段文字,我想把它包装成一个形状。这是博客详细信息页面上的一些社交共享URL。我想保持它干净,所以我决定做一个新的形状 我已经在下面发布了Content BlogPost.Detail.cshtml的完整列表,但我的想法是: 我制作了一个cshtml来保存社交媒体标记 我在主post详细视图中准备数据 我使用Model.Meta.add(socialShape,“1”)创建形状并将其添加到Meta区域(这是一个与元描述不同的本地区域) 形状按预期添加,但

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

我已经在下面发布了
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
    

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

    大多数形状只是按照添加顺序渲染它们的子图形。
    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));
        }
    
    [形状]
    公共空白区域(动态显示、动态形状、TextWriter输出){
    string id=Shape.id;
    IEnumerable类=Shape.class;
    IDictionary属性=Shape.attributes;
    var zoneWrapper=GetTagBuilder(“div”、id、类、属性);
    Write(zoneWrapper.ToString(TagRenderMode.StartTag));
    foreach(订单中的var项目(形状))
    输出.写入(显示(项));
    Write(zoneWrapper.ToString(TagRenderMode.EndTag));
    }
    

    通过从模板或形状方法代码中调用
    Order
    ,您可以在自己的形状中获得相同的效果。

    要启用排序,您应该将
    选项卡
    属性添加到形状
    元数据
    ,如下所示:

    socialShape.Metadata.Tab=”“;
    Model.Meta.Add(socialShape,“1”);
    
    这将禁用
    ContentZone
    中的形状分组


    我认为这是Orchard中的一个bug,但是这个解决方法应该可以解决您的问题。

    'ContentZone'也可以调用'Order'方法来对子图形进行排序。感谢您提供的提示,您的帮助指导我找到了正确的方法来诊断这实际上是一个bug:谢谢,您是对的,这是一个bug。在你的帮助下,我已经找到了足够多的问题,至少,我不能完全弄清楚它出了什么问题:这个错误将在Orchard的下一个版本中得到解决。谢谢你的帮助。
        [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));
        }