前些日子寫了篇博客,網友給予了很多的評論,在查看及回復評論的過程中,也是發現博客園現有回復的不太好,舉例如下,現有的回復如下圖所示:
,這里根本看不出來tony_ontheway說了什么,還要我一個一個找,哦,原來他是在第N頁第N行說了這個,所以非常的不方便。
所以今天我把網易蓋樓回復的實現原理以及實例Demo貼出,望博友們頂起來,讓博客園整改一下,必竟,博客園是我們的大本營,是我們學習知識的地方。這里高手如雲,精英薈萃,我們的大本營也不能太差,是吧。我們讓博客園改進,也是為自己創建良好的環境,所以,博友們,頂起來,吼起來,一起喚起博客園的注意。
實現蓋樓回復大致分三部。
第一步:建數據庫表,這個表需要有ID及父ID.
第二步:添加回復,添加回復的關鍵代碼如下:
var comment = StringExtension.ChangeStr(collection["comment"]); var bbsId = collection["comment_post_ID"].ToString(); var comment_parent = collection["comment_parent"].ToString(); //$引用3樓 測試蓋樓回復。。。 if (comment.IndexOf("$引用") >= 0) { comment = comment.Substring(comment.IndexOf("樓") + 1, comment.Length - comment.IndexOf("樓") - 1); } else { comment_parent = "0"; } NetFavCommentModel bbsComment = new NetFavCommentModel { commentContent = comment, NetFavId = Convert.ToInt32(bbsId), commentParentId = Convert.ToInt32(comment_parent), commentAddTime = DateTime.Now }; netFavCommentRepository.AddNetFavComment(bbsComment);
第三步:查詢回復,並以蓋樓方式顯示。關鍵代碼如下。
KeyValuePair<Pagination, IList<NetFavCommentModel>> bbsComment = netFavCommentRepository.NetFavCommentPagination(pagin, condition); int i = 1; foreach (var item in bbsComment.Value) { item.louId = i++; item.commentContent = GetContent(item, bbsComment.Value.ToList()); } ViewBag.bbsComment = bbsComment.Value; ViewBag.bbsCommentCount = bbsComment.Value.Count();
其中GetContent很重要,循環查詢,將蓋樓內容全部顯示出來。
相關代碼如下:
#region 蓋樓回復 // 根據當前的Comment得到HTML輸出 protected string GetContent(object objComment, List<NetFavCommentModel> list) { string output = ""; NetFavCommentModel cmt = (NetFavCommentModel)objComment; // 獲取當前評論 List<NetFavCommentModel> quoteList = new List<NetFavCommentModel>(); // 創建當前評論所引用的評論列表 AddComment(list, quoteList, cmt); // 為當前評論的引用列表添加項目 //quoteList.Sort(NetFavCommentModel.GetComparer()); // 對列表排序,順序排列 foreach (NetFavCommentModel quote in quoteList) // 生成引用的評論列表 { output = String.Format( "<div>{0}<span>網友 {1}的原貼:</span><br />{2}</div>", output, quote.commentAddMan, quote.commentContent); } // 添加當前引用 output = String.Format( "<div class='comment'><p class='title'><span>{0}樓{1} 發表</span>網友:{2}</p>{3}<p>{4}</p>" + "<p style='text-align:right;'><a class='comment-reply-link' href='#comment' " + "onclick='addQuote({0},{5});'>回復</a></p></div>", cmt.louId, cmt.commentAddTime, cmt.commentAddMan, output, cmt.commentContent, cmt.commentId); return output; } // 向quoteList中添加 符合條件的Comment protected void AddComment(List<NetFavCommentModel> list, List<NetFavCommentModel> quoteList, NetFavCommentModel cmt) { if (cmt.commentParentId != 0) { NetFavCommentModel find = list.Where(n => n.commentId == cmt.commentParentId).FirstOrDefault(); quoteList.Add(find); // 遞歸調用,只要CommentId不為零,就加入到引用評論列表 AddComment(list, quoteList, find); } else return; } #endregion
完成后截圖如下:
最后給出Demo示例網址 。本項目的源碼就不提供了,提供一套原生版Demo,有需要請下載。