作者: 彭斌 ,广州.NET俱乐部 2006-3-9

在去年的CS1.x专题中,我用了大部分的时间去讨论CS底层的结构与运行机制.在接下来的CS2.0系列文章中我将专著细节.来分析CS2.0的一些部件的实现.

CS1.0与2.0有些变化,但是运行机制变化不大,变化的只是细节与增加的功能.

细节的第一篇,我们从一个按钮开始说起:

上面的“邮件提醒”按钮是在CS2.0论坛模块里的一个具体帖子左上角出现的。该按钮不是一般的按钮,有图片并且还有文字(这个文字不是图片中的一部分那么简单,文字会根据xml的资源文件的不同而替换不同的语言),另外点击按钮还会通过Ajax回调一个服务器端方法,实现无刷新操作。

首先要明白的是,该按钮不是继承自Button,而是一个自定义控件。在CommunityServer.Controls项目,找到Utility文件夹下的ThreadSubscribeLinkButton.cs类。这就是该按钮的实现了。

public class ThreadSubscribeLinkButton : HtmlAnchor, ITrackedThread

该Button是继承了HtmlAnchor(就是HTML 的<a>)与 ITrackedThread。

ITrackedThread接口定义很简单:

public interface ITrackedThread

{

bool IsTracked { get;set;}

int ThreadID { get;set;}

bool Visible { get;set;}

}

三个属性,分别是“是否已经跟踪”、“被跟踪的线索ID”、“是否可见” ,这里说明一下thread这个单词在CS 中的解释:首先,一个论坛下的一个Post(我们一般叫帖子),发表后就会有一个thread,这个线索包括了Post本身,还包括针对该Post的回复等等。Post和其回复就形成了一个thread。

我们回到ThreadSubscribeLinkButton.cs类看一些重要的属性:

public virtual bool UseImages

public virtual string TrackingResourceName

public virtual string NotTrackingResourceName

public virtual string WorkingResourceName

由于CS是提供多种语言支持,所有想要替换按钮上的文字就需要这些属性了。同时,如果要显示在不同的操作状态,如:在处理的时候显示一个漏沙图标 ,还有在处理完成后要显示一个完成的图标 。这些都需要上述属性的支持。另外,我们可以看出这些属性是可以重写的。

接下来在类中还有几个重要的方法:

protected override void OnLoad(EventArgs e)

这是最早激发的一个事件实现,在CreateChildControls之前。在这里我们可以看到为该类为页面注册了一个Ajax方法:

AjaxManager.Register(this,this.GetType().Name,true,AjaxDebug.None);

(关于Ajax类这次细节分析暂时忽略)

protected override void CreateChildControls()

在OnLoad之后就建立控件内容,内容主要包括一些js脚本的,并且根据IsTracked的值判断按钮应该显示的文字和图片。

protected override void OnPreRender(EventArgs e)

在建立控件内容后,就触发预呈现的OnPreRender事件。在该方法下,主要根据UseImages的值判断调用下面两个方法中的哪一个。

private void BuildCallbackScript()

private void BuildCallbackScriptWithImages()

这两个私有方法,构造Ajax回调的脚步。

[AjaxMethod(IncludeControlValuesWithCallBack=false)]

public bool ToggleEmailReplies(int threadID)

这是Ajax回调的方法,也就是说当点击按钮后,会通过js 通过xmlhttp调用该方法。

ThreadTracking.ReverseThreadTrackingOptions(threadID, context.User.UserID);

通过上面的调用,最终把值保存到数据库。ToggleEmailReplies方法最后返回一个bool变量,客户端的js脚本就会根据这个bool值变化按钮的文字与图片。

转载于:https://www.cnblogs.com/guodapeng/archive/2007/12/21/1009058.html

Community Server2.0专注细节一 邮件提醒按钮实现(上) [转]相关推荐

  1. 自制CSDN博客评论邮件提醒

    CSDN 本身是有评论邮件提醒服务的.我知道,但是........... 你们自己看吧.... 干啥啊?邮件轰炸机嘛?? 拉黑,拉黑 !!! 自己搞一个了. 上代码: # -*- coding:utf ...

  2. java 拉取收件箱邮件源码_邮件提醒系统:新邮件识别

    最近在做邮件提醒抄送企业微信消息系统,就目前而言,无论是pop3还是imap都没有一个好的方法只接收新邮件,基本只能依靠收件箱列表message自行判断,下面给出几种思路并作对比. //收件箱 fol ...

  3. 域帐号密码快过期邮件提醒

    社会的快速发展,企业的规模也随之变大,这样企业的人数自然也增多,由于人数的众多,为了便于管理所以用起了域环境,但是根据某些企业的性质,部分员工也可能不登陆域帐号,以至密码过期,这样,时间一长,域帐号的 ...

  4. python QQ空间新说说邮件提醒功能实现

    先看一下qq邮件是怎么发送的!! 我们先做一个qq邮件发送的插件 #coding:utf-8 #导入所需要的工具包 import smtplib import time from email.mime ...

  5. 力扣每日一题每天自动邮件提醒

    A.需求来源与分析 需求来源于生活,对于只是偶尔有兴趣做做题的我,力扣的每日一题对我一直有以下的不便: 太简单不想做,需要花太多时间的不想做,每天打开力扣其实只是想看一下是什么题,有意思才做. 看题需 ...

  6. Nodejs监控Apple召回计划邮件提醒

    最近,我的13寸 MacBook Pro 2015款电池膨胀了 把笔记本平放在桌面,四个脚中的前两个无法落地,笔记本盖合上之后,屏幕上会印上键盘的纹路,也就是说,笔记本C面D面变形了,已经购买超过3年 ...

  7. WhatsUp的邮件提醒设置

    昨天用easy smtp server + whatsup 2006在xp上成功设置了到126.com的邮件提醒设置.不过很奇怪的是,当晚在idc机房的windows2003上却设置失败,easy s ...

  8. docker自动续期Freenom域名,配置邮件提醒

    1.引言 众所周知,Freenom是地球上唯一一个提供免费顶级域名的商家,不过需要每年续期,每次续期最多一年.利用docker自动续期Freenom域名,并配置邮件提醒 1.1 项目地址 freeno ...

  9. 【爬虫】力扣每日一题每天自动邮件提醒!!!

    使用python实现了一个力扣每日一题每天自动邮件提醒的小爬虫,小但实用!!! 文章目录 A.需求来源与分析 B.技术角度分析 C.具体分析步骤 1.接口协议分析 2.发邮件 3.写crontab放服 ...

最新文章

  1. redis 的一主二从三哨兵模式
  2. html响应式导航栏制作,用Sass制作响应式导航栏(原创)
  3. [react] react的性能优化在哪个生命周期?它优化的原理是什么?
  4. 区块链将如何影响你的生活?链圈大佬、美图董事长蔡文胜这样说
  5. Linux中如何打开trn文件,如何通过trn日志文件恢复SQL Server
  6. vue练习之vue+cnode api
  7. yum 安装的时候出现错误
  8. 记一次AD域域管理员密码更改导致某系统群集管理器故障排查解决过程
  9. AD画封装的血泪教训:有叉的放在外侧
  10. jdk下载安装并配置环境
  11. Adobe Creative Cloud Cleaner Tool 清除工具
  12. VS中多字节字符集和UNICODE字符集的使用说明
  13. html用css美化表单登录页面
  14. freemaker word转html,ftl文件-word文档转化成ftl文件
  15. 大神级ppt作品欣赏_中班美术课件星空PPT课件教案图片音乐
  16. Word中快速输入公式
  17. 在浏览器中打开“只能用微信内置浏览器”打开的页面
  18. 税务总局:今年预计减税1.8万亿元!个体户能享受哪些税收优惠?
  19. win10安装visio2010出错_为何我安装Visio 2010时会安装不上,提示下面的错误
  20. 皕杰报表自定义扩展~自定义数据集

热门文章

  1. 剑指offer---反转链表
  2. github不用输入用户密码即可登录
  3. 重写与重载的区别 以及 重写中super的使用
  4. centos 7 配置nginx
  5. Java知多少(完结篇)
  6. SVG关注复杂图形的网页绘制技术
  7. 数据类型的sizeof
  8. linux 下文件管理值得注意的地方
  9. js foreach用法_使用 nodejs 写爬虫(一): 常用模块和 js 语法
  10. VS2019 C#安装那些插件_【完整版】针对零基础小白的VS2019安装攻略