本文来源:http://www.wojilu.com/forum1/topic/4193 

一、通用评论简介

在绝大多数系统中,“评论”都是必须的,是一个非常通用的功能。在旧版的wojilu系统中,曾经专门抽象出这部分代码,方便复用:http://www.wojilu.com/Common/Page/52 ,但是仍然要写c#,额外设计数据表,没能做到极简化。

这几年,SNS发展迅猛,许多SNS平台都推出了外挂的评论系统,比如 facebook,新浪微博等,只要在你的页面中嵌入 facebook 等提供的评论脚本,评论功能会自动启用。这些SNS平台依靠强大的技术实力和后台运维系统,为你的评论功能提供了可靠的保障。

除此之外,还有独立的第三方评论系统,在国内外纷纷出现。比如国外比较著名的是 http://disqus.com,国内的 http://www.uyan.cc 等。

说实话,写好一个评论组件,还是很复杂的。尤其现在对用户体验要求很高,必须用上各种 ajax 客户端效果,才能勉强可行。有了独立的评论组件,自己省时省力,甚至能将传统的静态页面,瞬时转换为博客。比如 github 就有静态页面托管功能,现在许多用户就通过这种手段,就 github 的静态页面做成了独立博客。


二、为什么使用wojilu的评论组件?

既然有了第三方评论组件,为什么我记录还要开发一个类似的?

原因主要是3个方面:

首先,如果使用第三方组件,数据必须托管在其他人那里,比如新浪微博。虽然这些大型平台可以提供更可靠的服务器支持,但如果你恰好对数据的安全性非常敏感,不想受制于人,那就不行了。

其次,wojilu可以用在内网场合,比如作为企业内部的知识库使用,在某些特殊时候,企业内网是无法连上互联网的,第三方组件自然就不可用。

最后,如果你想扩展功能,我记录的评论组件是开放源码的,你可以自行修改。

当然,从技术的角度来讲,独立的评论组件也方便系统扩展,因为可以轻松将评论数据拆分到独立服务器上,降低现有机器的负载。


三、如何挂接通用评论组件?

1、在 html 模板中,嵌入这部分代码


<div>
    <div><a href="#{commentUrl}" id="comentLink" class="frmLink" loadTo="commentMain" nolayout=999></a></div>
    <div id="commentMain"></div>
</div>

<script>
    _run(function () {
        wojilu.ctx.changeUrl= false;
        wojilu.ui.frmLink();
        $('#comentLink').click();
    });
</script>



2、然后在后台添加c#代码,设置评论组件的网址

String commentUrl = t2( new wojilu.Web.Controller.Open.CommentController().List )
    + "?url=" + clink.toPost( post, ctx )
    + "&dataType=" + typeof( ContentPost ).FullName
    + "&dataTitle=" + post.Title
    + "&dataUserId=" + post.Creator.Id
    + "&dataId=" + post.Id;

 set( "commentUrl", commentUrl );

其中 post/ContentPost 请根据你的实际数据变通处理。


以上两个步骤中的 commentUrl ,也可以直接写在 html 中,实际的代码是这样:

/Open/Comment/List.aspx
?url=/html/2011/12/26/213.html
&dataType=wojilu.Apps.Content.Domain.ContentPost
&dataTitle=温家宝离京访问欧亚四国 中国掀秋季外交高潮
&dataUserId=1
&dataId=213

如果你不需要动态配置 url 后缀名,其实这样写更加方便,就不用第二个步骤改c#代码了。


3、同步评论数量


如果需要将评论的数量同步到被评论对象,此“被评论对象”必须实现 ICommentTarget 接口。

如果要在加载评论组件的页面中显示评论数量,主页面必须有一个 id=contentReplies 的元素——

评论:<span id="contentReplies">0</span>

然后评论组件在加载时,会自动给这个 contentReplies 元素赋值。


-------【以下内容过期,不推荐】-------------------------------------

我们需要给每一个下载的文件后面加上评论功能,效果如下图所示:

这个评论你完全可以自己一步一步的写出来,但是不建议这么做,因为这个功能看似简单,实际还是比较复杂的,这个评论的功能点有:

1)可以区分已登录用户和游客
2)可以ajax异步提交数据
3)游客必须通过验证码验证
4)数据经过服务器端和客户端双重校验
5)每条评论都可以回复,并且ajax异步(引用)回复
6)评论可以管理删除
7)后台管理员可以针对此app的所有评论集中管理删除
8)用户发表评论、或回复评论之后,可以同时发布到动态列表中
9)用户发表评论之后,给上一条或引用的评论的作者,以及数据的作者,都发送通知
10)评论多了之后,要能够分页显示

——通过复用 “我记录网站综合系统” 中已有的评论组件,如上10条功能可以比较简单的实现。

一、建立一个 FileComment 对象


注意:
1)这个对象必须实现 IComment 接口;
2)同时被评论的对象,也就是前面的 FileItem 必须实现 IAppData 接口
3)另外,FileItem 必须有一个 Replies 属性,用于记录被评论的次数。
4)要让评论行为信息可以发布到动态消息中,必须实现 AddFeedInfo 方法
5)要给被评论的作者发送通知,必须实现 AddNotification 方法

这两个方法,一个是发送动态消息,一个发送通知,FileComment.cs 代码中已经实现。
如果你开发其他的app,只要把这两段代码拷贝过去,稍微修改一下就可以使用了。

二、在控制器中复用评论组件

分成2个步骤:

1)创建 FileCommentController 控制器

注意,这个控制器继承自 CommentController ,并且实现了一个方法 getTargetLink,这个方法返回下载项的链接。

2)加载评论内容和表单
评论组件总是出现在文件显示页面的下部,也就是在 FileController 的 Show 方法中。
我们打开 FileController.cs 文件,然后添加一个 bindComment 方法:


、在页面视图中使用评论组件