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 ...
随机推荐
- ASP.NET Gridview数据库绑定支持增删改,记得要完整实现
1.错误情况 /WebSite3"应用程序中的服务器错误. 指定的参数已超出有效值的范围. 参数名: index 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息, ...
- Net分布式系统之六:微服务之API网关
本人建立了个人技术.工作经验的分享微信号,计划后续公众号同步更新分享,比在此更多具体.欢迎有兴趣的同学一起加入相互学习.基于上篇微服务架构分享,今天分享其中一个重要的基础组件“API网关”. 一.引言 ...
- http协议中:GET/POST/PUT/DELETE/TRACE/OPTIONS/HEAD方法
###1 HTTP/1.1协议中共定义了八种方法(有时也叫"动作")来表明Request-URI指定的资源的不同操作方式: OPTIONS 返回服务器针对特定资源所支持的HTTP请 ...
- java 空指针异常造成的原因有哪些
实际上 空指针异常 也就是你用了一个没有实际值的对象 1. 某一对象没有被实例化,就拿来使用,如调用此对象的方法,会抛空指针异常. 2. 获取从别的对象传过来的对象为空 3. 数据库查询方面的空指 ...
- (基础篇 走进javaNIO)第二章-NIO入门
在本章巾,我们会分别对 JDK 的BIO ,NIO 和JDK 1.7 最新提供的 NI02.0的使用进行详细说明 ,通过流程图和代 码讲解,让大 家体会到随着 Ja va 1/0 类库的 不断发展和改 ...
- javaWeb学习总结(10)- EL表达式
一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...
- SparkMLlib学习之线性回归
SparkMLlib学习之线性回归 (一)回归的概念 1,回归与分类的区别 分类模型处理表示类别的离散变量,而回归模型则处理可以取任意实数的目标变量.但是二者基本的原则类似,都是通过确定一个模型,将输 ...
- 织梦CMS去广告方法 for DedeCMS V5.7
DedeCms 5.7新版发布,下来上传至服务器安装完毕,点击进入后台登陆界面,怎么多了广告链,而且登陆界面也变了,以前可不带这样的啊.按步骤一步一步来去版权再去广告吧. 一,去处后台登陆页login ...
- 最短路径Floyd算法【图文详解】
Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被 ...
- bootstrap中的下拉菜单
下拉菜单必要的代码: <div class="container"> <div class="dropdown"> <butt ...