回复的简易实现
回复的简易实现
前些日子写了篇博客,网友给予了很多的评论,在查看及回复评论的过程中,也是发现博客园现有回复的不太好,举例如下,现有的回复如下图所示:
,这里根本看不出来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测试数据mentContent = 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测试数据mentAddMan, quote测试数据mentContent); } // 添加当前引用 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测试数据mentAddTime, cmt测试数据mentAddMan, output, cmt测试数据mentContent, cmt测试数据mentId); return output; } // 向quoteList中添加 符合条件的Comment protected void AddComment(List<NetFavCommentModel> list, List<NetFavCommentModel> quoteList, NetFavCommentModel cmt) { if (cmt测试数据mentParentId != 0 ) { NetFavCommentModel find = list.Where(n => n测试数据mentId == cmt测试数据mentParentId).FirstOrDefault(); quoteList.Add(find); // 递归调用,只要CommentId不为零,就加入到引用评论列表 AddComment(list, quoteList, find); } else return ; } #endregion
完成后截图如下:
最后给出Demo 示例网址 。本项目的源码就不提供了,提供一套原生版Demo,有需要请 下载 。
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did46670