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 ...
随机推荐
- JSP Cookie的使用
Cookie 通常用于网站记录客户的某些信息,比如客户的用户名及客户的喜好等.一旦用户下次登录,网站可以获取到客户的相关信息,根据这些客户信息,网站可以对客户提供更友好的服务. Cookie sess ...
- 当KDS晶振遇上爱普生晶振国内生产厂家该如何抉择?
当KDS晶振遇上爱普生晶振国内生产厂家该如何抉择? 全球做晶振行业的公司有很多,单说深圳一个城市就有几十上百家正规的晶振厂家,深圳市金洛电子就是其中之一.我们不光代理日本和台湾多家排得上名 ...
- VUE依赖webpack分别给开发环境和生产环境配置不同的常量值并在项目中动态引用
当在开发和产品上线的时候,我们经常会遇到在同一个地方由于环境的不同而地址也不同的情况,这时候如果在代码中将该地址写死,那势必会造成上线时手动改动,多人开发及多处使用该地址难以维护等一系列问题,为避免这 ...
- javaWeb学习总结(10)- Filter(过滤器)学习(2)
在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...
- 深入tornado中的http1connection
前言 tornado中http1connection文件的作用极其重要,他实现了http1.x协议. 本模块基于gen模块和iostream模块实现异步的处理请求或者响应. 阅读本文需要一些基础的ht ...
- 选择排序——Python实现
选择排序: 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小( ...
- ReactNative学习之Html基础
前言: React Native开发作为一种新型的移动开发方式,个人觉得App的一部分需求会逐步替换成这种方式,也是公司移动开发人员所必须掌握的一种开发技术,所以鉴于这种情况我觉得很有必要学习一下,特 ...
- android Activity Application Context 的区别
用了这么久的Context,对于Context究竟是个什么玩意一直不是很明白.看了网上十几篇文章的介绍 加上自己的理解总结一下.(自己想法,不对勿喷,不想照搬网上一些文字说法来糊弄自己,自己理解的就这 ...
- Hadoop化繁为简(二)—层层递进轻松入门hdfs
层层递进-解开hdfs的面纱 1.hdfs是什么?它与普通服务器的文件系统有什么区别?它的特性有什么? 2.hdfs的工作原理是怎样的? 3.每台机器都单独启动有什么弊端?假设有1000台机器需要启动 ...
- 在eclipse中输入.后提示解决
1.调用系统自带的提示: 如果在eclipse中输入.后没有提示对应对象的属性和方法帮助列表,可以进行以下设置就可以了 eclipse -> Window-> Preferences-&g ...