我在弄清楚如何根据其创建的日期以降序排序的项目列表很难(我知道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);
它消除了另一条代码。