Implement a comment system using EPiServers datastore by using Paul Smith's DynamicDataStoreSession class
Hi!
First I would want to start this post by thanking Paul Smith for taking the time to point out the mistakes I had done in the last post I did about this, I learned a lot how to use the datastore in a correct way from his help! Thanks Paul!
This post is about how we can use Paul Smith's DynamicDataStoreSession class with very little code to implement a comment system for our EPi pages using the EPiServer datastore.
The idea is that I will create an Usercontrol that I can place on a page where I want people to be able to comment the content.
I start off with creating my entity class:
public class Comment
{
public Identity Id { get; set; }
[EPiServerDataIndex]
public Guid PageGuid { get; set; }
public string UserName { get; set; }
public string Location { get; set; }
public string UserComment { get; set; }
public DateTime Date { get; set; }
}
Note that my PageGuid property has the attribute [EPiServerDataIndex], it will tell the DDS to map the property to an indexed database column, which will speed up retrieving the data.
I then make a factory class were I will add my datastore methods:
public static IEnumerable<Comment> GetComments(Guid pageGuid)
{
var session = new DynamicDataStoreSession<Comment>();
return session.Find().Where(p => p.PageGuid).Equals(pageGuid).Go().OrderByDescending(p => p.Date);
}
public static void SubmitComment(string comment, Guid pageGuid)
{
var store = new DynamicDataStoreSession<Comment>();
var newComment = new Comment
{
Id = Identity.NewIdentity(Guid.NewGuid()),
UserName = Membership.GetUser().UserName,
Location = "Stockholm, Sweden",
UserComment = comment,
Date = DateTime.Now,
PageGuid = pageGuid
};
store.Save(newComment);
}
My usercontrol looks like this:
<asp:Repeater ID="repComments" runat="server">
<ItemTemplate>
<tr>
<td><%# DataBinder.Eval(Container.DataItem, "UserName")%> (<%# DataBinder.Eval(Container.DataItem, "Location")%>) </td>
<td><br /><%# DataBinder.Eval(Container.DataItem, "UserComment")%></td><br /><br />
</tr>
</ItemTemplate>
</asp:Repeater>
and in the code behind:
protected void Page_Load(object sender, EventArgs e)
{
repComments.DataSource = ArticleComment.GetComments(CurrentPage.PageGuid);
repComments.DataBind();
}
protected void btnComment_Click(object sender, EventArgs e)
{
if (tbComment.Text == "")
return;
ArticleComment.SubmitComment(tbComment.Text, CurrentPage.PageGuid);
repComments.DataSource = ArticleComment.GetComments(CurrentPage.PageGuid);
repComments.DataBind();
tbComment.Text = "";
}
I hope you had fun and found this post useful :)
Comments