SITECORE按创建日期问题进行排序



我在弄清楚如何根据其创建的日期以降序排序的项目列表很难(我知道Sitecore允许按其创建的日期按上升顺序对项目进行排序)。我对Sitecore仍然很新,所以我不确定该怎么办...任何建议会有所帮助!

 Item[] BlogPosts = HomeItem.Axes.SelectItems(@"child::*[@@templatename='BlogComment']");
            if (BlogPosts != null)
            {
                DataSet ds = new DataSet();
                DataTable posts = ds.Tables.Add("posts");
                posts.Columns.Add("PostName", Type.GetType("System.String"));
                posts.Columns.Add("DateCreated", Type.GetType("System.String"));
                posts.Columns.Add("PostComment", Type.GetType("System.String"));
                foreach(Item PostItem in BlogPosts)
                {
                    DataRow dr = posts.NewRow();
                    dr["PostName"] = PostItem.Fields["Name"].Value;
                    dr["DateCreated"] = PostItem.Statistics.Created;
                    dr["PostComment"] = PostItem.Fields["Comment"].Value;
                    posts.Rows.Add(dr);
                }
                commentsListRptr.DataSource = ds;//this is a repeater I'm using to show the data
                commentsListRptr.DataMember = "posts";
                commentsListRptr.DataBind();
            }

您可以使用linq:

对项目进行排序
var items = Sitecore.Context.Database.SelectItems("/sitecore/content/home/*");
items = items.OrderBy(x => x[Sitecore.FieldIDs.Created]).Reverse();

显然更改查询或项目列表以满足您的要求。

编辑代码添加后:

在您的ASCX中设置一个中继器,我们将使用Sitecore fieldRenderer,但在此控件中禁用网络编辑:

<asp:Repeater ID="rptBlogPosts" runat="server" OnItemDataBound="rptBlogPosts_ItemDataBound">
    <HeaderTemplate><table></HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td><sc:FieldRenderer runat="server" ID="PostName" FieldName="Name" DisableWebEditing="True" /></td>
            <td><asp:Literal runat="server" ID="PostDate"></asp:Literal></td>
            <td><sc:FieldRenderer runat="server" ID="PostComment" FieldName="Comment" DisableWebEditing="True" /></td>
        </tr>
    </ItemTemplate>
    <FooterTemplate></table></FooterTemplate>
</asp:Repeater>

在page_load的背后代码中绑定控件,绑定中继器的数据源,然后设置fieldRenderer项目并以格式显示创建的日期以适合。

private void Page_Load(object sender, EventArgs e)
{
    Item[] BlogPosts = HomeItem.Axes.SelectItems(@"child::*[@@templatename='BlogComment']");
    if (BlogPosts.Any())
    {
        rptBlogPosts.DataSource = BlogPosts.OrderBy(x => x[Sitecore.FieldIDs.Created]).Reverse();
        rptBlogPosts.DataBind();
    }
}
protected void rptBlogPosts_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var currentItem = e.Item.DataItem as Item;
        var scPostName = e.Item.FindControl("PostName") as FieldRenderer;
        var litPostDate = e.Item.FindControl("PostDate") as Literal;
        var scPostComment = e.Item.FindControl("PostComment") as FieldRenderer;
        scPostName.Item = currentItem;
        litPostDate.Text = currentItem.Statistics.Created.ToString("H:mm:ss MM/dd/yy");
        scPostComment.Item = currentItem;
    }
}

您的sitecore查询可能是非常昂贵的性能,具体取决于您的内容树的深度,我不确定您正在使用哪种版本的Sitecore,但是无论如何您都希望索引您的内容(使用Lucene)并使用它来检索帖子。如果您使用的是Sitecore 7,请查看有关Linq到Sitecore的这篇文章

使用相同的想法,您也可以使用以下...

var items = Sitecore.Context.Database.SelectItems("/sitecore/content/home/*").OrderByDescending(x => x.Statistics.Created);

它消除了另一条代码。

相关内容

  • 没有找到相关文章

最新更新