MVC通过递归+部分视图实现评论
前一个项目里有一个关于评论系统的需求。感觉这个评论的实现还是蛮好玩的,所以记录下这个系统的实现相关内容。
功能需求:
1、用户可以再视屏下方留言。
2、用户可以再别的用户留言下方回复。
3、用户可以删除自己的留言,删除之后所有属于这个留言的子留言都会被删除。
分析:
看到上面这个需求的时候,想法是可以把这个留言内容作为一个“留言树”,一个留言就是一个根节点,然后留言下方的回复就是根节点下方的字节点。回复的回复就是子节点的子节点。
所以数据库的设计就要提现这几个要素:①父节点标记 ②本身节点标记 ③标记时间(用于区分两个兄弟节点谁先谁后)

“SourseID”表示这个评论所属哪个课件资源。
接下来是树的生成了,主要的设计思路如下:
1、当需要课件A的评论树的时候,先从数据库中取出所有“SourseId”为课件A的评论数据,把上述数据放入队列Queue中,并定义一个空的树Tree
2、Queue出队一个数据D,数据D在Tree中通过递归逐层查询自己的父节点,如果找到父节点就在Tree相应位置插入数据D,如果没有找到就把D再入队Queue中。
3、重复2的操作,直至Queue空队
代码如下:
/// <summary>
/// 获取页面视图所需要的评论树
/// </summary>
/// <returns></returns>
public List<CommentTree> GetCommentsForView(int SourseId)
{
List<CommentTree> trees = new List<CommentTree>();
List<CommentInfEntity> comments = dal.SelectCommentInfs($" AND C.SourseID ='{SourseId}'");
Queue<CommentInfEntity> queues = new Queue<CommentInfEntity>(comments);
while(queues.Count!=)
{
CommentInfEntity c = queues.Dequeue();
if (c.PId == )
{
CommentTree tree = new CommentTree();
tree.Node = c;
tree.Branch = new List<CommentTree>();
trees.Add(tree);
trees = trees.OrderBy(x => x.Node.CommentTime).ToList();
}
else if (c.PId != )
{
c.PName = comments.Where(x => x.Id == c.PId).FirstOrDefault().Name;
if (!ParentIsExist(trees,c))
{
queues.Enqueue(c);
}
}
}
return trees;
}
/// <summary>
/// 迭代修改
/// </summary>
/// <param name="trees"></param>
/// <param name="queue"></param>
/// <returns></returns>
private bool ParentIsExist( List<CommentTree> trees, CommentInfEntity queue)
{
for(int i=;i<trees.Count;i++)
{
if (trees[i].Node.Id == queue.PId)
{
CommentTree t = new CommentTree();
t.Branch = new List<CommentTree>();
t.Node = queue;
trees[i].Branch.Add(t);
trees[i].Branch = trees[i].Branch.OrderBy(x => x.Node.CommentTime).ToList();
return true;
}
else
{
if (ParentIsExist(trees[i].Branch, queue))
{
return true;
}
}
}
return false;
}
这样子最后的Tree就获得了。
然后在视图里面就可以用Html.RenderPartial来显示了
@foreach (CommentTree tree in ViewBag.CommentInf)
{
<div class="weui-cell">
<div class="weui-cell__hd"><i class="glyphicon glyphicon-user"></i></div>
<div class="weui-cell__bd">
<p>@(tree.Node.Name):@(tree.Node.Comments)</p>
</div>
<div class="weui-cell__ft"><i commentname="@(tree.Node.Name)" commentid="@(tree.Node.Id)" class="glyphicon @(tree.Node.WeiXinPublicId == ViewBag.UserWeiXin ? "glyphicon-remove":"glyphicon-pencil") " id="@(tree.Node.WeiXinPublicId == ViewBag.UserWeiXin ? "del-comment":"rep-comment")"></i></div>
</div>
foreach (var node in tree.Branch)
{
Html.RenderPartial("../Course/CommentParyial", node);
}
}
部分视图:
<div class="weui-cell reply">
<div class="weui-cell__hd"><i class="glyphicon glyphicon-user"></i></div>
<div class="weui-cell__bd">
<p>@Model.Node.Name 回复 @Model.Node.PName:@Model.Node.Comments</p>
</div>
<div class="weui-cell__ft"><i commentname="@(Model.Node.Name)" commentid="@(Model.Node.Id)" class="glyphicon @(Model.Node.WeiXinPublicId == ViewBag.UserWeiXin ? "glyphicon-remove":"glyphicon-pencil") " id="@(Model.Node.WeiXinPublicId == ViewBag.UserWeiXin ? "del-comment":"rep-comment")"></i></div>
</div> @foreach (var node in Model.Branch)
{
Html.RenderPartial("../Course/CommentParyial", node);
}
上述部分视图也是用了递归的方法。
首先在页面上面显示根节点Node,然后把子节Child点发送给部分视图页面,部分视图页面获得数据后,把得到的子节Child点作为根节点显示,然后把Child的子节点发送给部分视图。。。。。最后直至数据结束,
MVC通过递归+部分视图实现评论的更多相关文章
- ASP.NET Core MVC之ViewComponents(视图组件)
		
前言 大概一个来星期未更新博客了,久违了各位,关于SQL Server性能优化会和ASP.NET Core MVC穿插来讲,如果你希望我分享哪些内容可以在评论下方提出来,我会筛选并看看技术文档来对你的 ...
 - ASP.NET Core MVC之ViewComponents(视图组件)知多少?
		
前言 大概一个来星期未更新博客了,久违了各位,关于SQL Server性能优化会和ASP.NET Core MVC穿插来讲,如果你希望我分享哪些内容可以在评论下方提出来,我会筛选并看看技术文档来对你的 ...
 - [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型、视图、控制器、路由等的基本操作
		
[.net 面向对象程序设计深入](6).NET MVC 6 —— 模型.视图.控制器.路由等的基本操作 1. 使用Visual Studio 2015创建Web App (1)文件>新建> ...
 - MVC(Model(模型)  View(视图)  Controller(控制器))
		
复习 1. 商品表 增删改查 index.php add.php view.php edit.php action.php 2. MVC(Model(模型) Vie ...
 - MVC使用jQuery从视图向控制器传递Model,数据验证,MVC HTML辅助方法小结
		
//MVC HTML辅助类常用方法记录 (1)@Html.DisplayNameFor(model => model.Title)是显示列名, (2)@Html.DisplayFor(model ...
 - MVC中使用分部视图参数,改变分部视图连接样式
		
MVC中使用分部视图参数,改变分部视图连接样式! Controller代码 [ChildActionOnly] public ActionResult Navigator(int tag) { ret ...
 - spring mvc: 可参数化的视图控制器(在配置中指定jsp文件)MultiActionController/SimpleUrlHandlerMapping/ParameterizableViewController
		
spring mvc: 可参数化的视图控制器(在配置中指定jsp文件)MultiActionController/SimpleUrlHandlerMapping/ParameterizableView ...
 - ASP.NET MVC传递Model到视图的多种方式总结
		
ASP.NET MVC传递Model到视图的多种方式总结 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel T ...
 - ASP.NET MVC传递Model到视图的多种方式之通用方式的使用
		
ASP.NET MVC传递Model到视图的多种方式总结——通用方式的使用 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData Vi ...
 
随机推荐
- 微信小程序开发之获取openid及用户信息
			
1. 获取openid 1.1 获取code 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的会话密钥(session_key).用户数据的加解 ...
 - Bootstrap实现轮播图
			
第一步:设计轮播图容器:div.carousel,添加slide平滑切换,并定义id,方便后面采用data属性来触发 <div class='carousel slide' id="t ...
 - 网站权限管理 之  角(jue)色管理
			
公司或网站的正常运行,离不开管理员对各个员工的合理分配,那先看看权限管理中的角色管理好了: 要更改用户的角色,那么先来理一下思路: (1)用户现在是什么角色? (2)用户将要成为什么角色? (3)怎样 ...
 - spring-定时器(1)
			
先看一个例子 一.demo1(MethodInvokingJobDetailFactoryBean) 1.要执行业务类 public class BusinessReport { public voi ...
 - 【面向对象设计原则】之里氏替换原则(LSP)
			
里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing 教授于1994年提出,所以使用的是这位女博士的性命名的一个 ...
 - Fitting Bayesian Linear Mixed Models for continuous and binary data using Stan: A quick tutorial
			
I want to give a quick tutorial on fitting Linear Mixed Models (hierarchical models) with a full var ...
 - Images as x-axis labels
			
Open-source software is awesome. If I found that a piece of closed-source software was missing a fea ...
 - nodeJS实现简单网页爬虫功能
			
前面的话 本文将使用nodeJS实现一个简单的网页爬虫功能 网页源码 使用http.get()方法获取网页源码,以hao123网站的头条页面为例 http://tuijian.hao123.com/h ...
 - Javascript事件模型(三):JavaScript事件绑定方法总结(及Jquery)
			
JavaScript中绑定事件的方法主要有三种: 1 在DOM元素中直接绑定 2 JavaScript代码中直接绑定 3 绑定事件监听函数 JQuery中绑定事件的几种方法 主要有on().bind( ...
 - iOS项目评估报告
			
1.整体项目无分层概念,结构混乱,代码耦合严重. 影响:后期扩展困难,维护困难. 解决方案:1.整体采用mvc模式. 2.在原来的基础再抽离出业务层 3.业务层按模块管理,合理分层分包. 4.做好共用 ...