相信看过Community Server(以下简称CS)代码的人都会被它的架构模式深深吸引,它良好的架构为以后的扩展提供了无限的空间。但是对于初学者来说要想看懂CS的架构源码却非易事。就皮肤这一块就足以让初学者望而却步了,看着层层的继承、组合复杂的调用关系确实让人很难一下子就能看明白,更别提拿到现实项目中加以应用了。我也是一个初学者,前一段时间开发项目用到了皮肤,所以想拿CS的皮肤机制来实现,于是我把TemplatedWebControl.cs文件拷贝过来,打开一看就晕了,这么多东西都是干吗用的呢?仔细研究了一下发现原理并不复杂于是决定自己动手实现一套简单的,下边我就将我的实现思路和代码拿出来。

首先我向菜鸟们讲一下CS模板的基本原理(老鸟就不用看了):

原理很简单我用一个图表示一下

TemplatedWebControl是CS皮肤控件基类,所有的CS皮肤控件都继承与TemplatedWebControl,它们其实就是一个自定义的WebControl,跟你自定义的分页控件阿什么的没什么区别,只是它们能够充当控件容器,它们可以根据ThemeName来装载不同的皮肤文件(ascx文件),那么基本调用流程是aspx页面上调用这些CS皮肤控件这些控件在根据ThemeName去装载ascx皮肤文件从而实现了皮肤机制.也就是说其实这些CS皮肤控件其实就是一个代理控件,aspx文件告诉它"我要调用ascx皮肤文件",CS皮肤控件接收到请求后根据当前的ThemeName的值去加载ascx文件最后返回给aspx。很简单吧?好了我们继续。

原理搞清楚了,原来就是自己做了一个控件容器做代理,既然是控件容器那么非得自己继承WebControl和INamingContainer来开发吗?当然不是了,MS给我们提供了一个很好的容器控件——PlaceHolder,我们就用它做我们的ascx控件的代理吧,好了废话少说还是看具体的代码吧

首先我们也要跟CS一样建立一个CS皮肤控件的基类,当然肯定要比CS中的TemplatedWebControl简单的多,代码如下:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;

[assembly: TagPrefix("TestTemplate.Controls", "Container")]
namespace TestTemplate.Controls
{
    public abstract class BaseControlContainer:PlaceHolder
    {
        public override Control FindControl(string id)
        {
            Control ctrl = base.FindControl(id);
            if (ctrl == null && this.Controls.Count == 1)
            {
                ctrl = this.Controls[0].FindControl(id);
            }
            return ctrl;
        }

private string _SkineName = "UserControls/Test.ascx";

[Category("皮肤设置")]
        [Description("皮肤名称")]
        public string SkineName
        {
            get { return _SkineName;}
            set { _SkineName = value; }
        }

protected override void OnLoad(EventArgs e)
        {
            Page = HttpContext.Current.Handler as System.Web.UI.Page;//获取当前上下文的Page
            this.Controls.Add(Page.LoadControl(_SkineName));//装载ascx控件
            AttachChildControls();
            DataHandle();
        }
        protected abstract void AttachChildControls();//附加控件

protected abstract void DataHandle();//数据处理

}
}

这是个抽象类具体实现很简单,比如创建一个apcx文件相应的建立一个cs文件并继承BaseControlContainer实现AttachChildControls和DataHandle就搞定了!例如:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace TestTemplate.Controls
{
    public class TestControl:BaseControlContainer
    {
        TextBox Textbox1;

protected override void AttachChildControls()
        {
     //在这里查找ascx页面上的控件
            Textbox1 = FindControl("textbox1") as TextBox; 
        }

protected override void DataHandle()
        {
     //这里对页面控件进行数据处理
            Textbox1.Text = "OK";
        }
    }
}

OK!到此全部搞定,怎么样够简单吧?当然这个安全性不是特别好,比如当加载皮肤的时候路径错误的时候加载默认的阿这些都没有,如果需要的话可以加上,总之这个例子是本着简单来着,希望能起到抛砖引玉的作用。说得不对的地方欢迎大家指教。

转载于:https://www.cnblogs.com/lxsfg/articles/849132.html

简化CommunityServer模板机制相关推荐

  1. Discuz!NT 模板机制分析(转)

    作为产品中的一大特色,模板机制一经推出,就引来了大家特别是站长们的关注.但它所饱受的风风 雨雨也成了那时不少人关注的话题.而今天本人将结合在产品组中的开发经历,介绍一下模板机制在设计 使用时的一些体会 ...

  2. 快速理解shopex模板机制经验教程(一)

    shopex是程序和模板分离的,这样就大大方便了大家可以做出自己漂亮的外观网站, 虽然很多地方分离得不够,比如一些核心的业务流程区基本大家就很难修改了,但是大部分还是满足网站基本要求的. 首先,说说模 ...

  3. C++函数模板机制结论

    函数模板机制结论: 编译器并不是把函数模板处理成能够处理任何类型的函数 函数模板通过具体类型产生不同的函数 编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后 ...

  4. c++模板--2(模板机制,模板的局限性,类模板,类模板做函数的参数)

    函数模板机制结论 编译器并不是把函数模板处理成能狗处理任何类型的函数 函数模板通过具体类型产生不同的函数 编译器会对函数模板进行两次编译,在声明的地方对模板代码的本身进行编译,在调用的地方对参数替换后 ...

  5. magento邮件使用php,用Magento的Email模板机制发邮件

    Magento的Mage::getModel('core/email_template')模型可用来发信. 步骤I. 在你的模块(其实任意Module都可以)的etc/config.xml的根标签下添 ...

  6. Shopex模板机制总览(摘要版)

    Shopex模板机制总览(摘要版) 此文档旨在为 shopex 二次开发提供一个便利的参考信息,借以打开 shopex 架构的大门,希望能带给读者一种登堂入室的感觉.由于 shopex 是半开放源代码 ...

  7. 新闻系统(1)之模板机制

    新闻系统之模板机制 我们在做 cms,bbs, 或者多用户商城的时候,都会遇到模板机制.现在大多系统采用的都是老办法,做一个 html 文件,里面加上变量,再用一支程序读出这个 html ,替换里面的 ...

  8. 关于CMS的模板机制的一些讨论

    在讨论一个模板机制是否合理之前,首先要清楚它的使用群体,将模板与代码分别,最重要的作用在于实现项目标MVC机制,对于Java..Net等架构而言,最终展现层的模板都是用XML的语法设计的,使用类作为逻 ...

  9. MTK:屏幕模板机制

    转载出处不详!若有冒犯,敬请联系! 声明:前阶段进行了近两个月的MTK平台上层开发,由于缺乏技术支持,对于整个平台的认识都是通过简略的文档和浅薄的经验摸索出来的.其间整理了一些文档.由于联发科提供的P ...

  10. 关于.net实现网站模板机制(非标签替换)

    效果演示:http://cms.19870123.cn/Manager/ 进入后点击主题管理,更换后在首页可以查看效果 用户名:test 密码:test 看到很多.net的程序实现模板都是使用标签替换 ...

最新文章

  1. iOS使用多线程提高数据并发访问 之七
  2. Java高级规范之二
  3. python词汇-基本 Python 词汇
  4. 用sql语句获取连续整数id中,缺失的最小id和最大id
  5. 22.PATH环境变量
  6. 零基础学习爬虫并实战
  7. Fedora 17删除旧内核的操作
  8. ERROR: Start Page at 'www/index.html' was not found
  9. 攻防世界web新手区解题 /cookie / disabled_button / weak_auth
  10. linux 磁盘簇,linux系统exec簇工作原理
  11. android e图标一会有一会没有反应,android解决菜单Menu添加Icon无效问题,让菜单同时显示图标和文字...
  12. Ztree加载完成后显示勾选节点
  13. 学习笔记:Unity战斗卡牌游戏(三)-----代码加载预设 及 Tween动画使用及播放回掉...
  14. 谷歌livereload插件使用
  15. geektool 天气_如何使用Geektool自定义Mac桌面
  16. mysql pdf教程_MySQL5.7从入门到精通(刘增杰 著)带书签完整版PDF[230MB]
  17. 从苦逼走向牛逼:阿里云的苦难辉煌
  18. 体胖还需勤跑步,人丑就该多读书!
  19. HNOI 2018 滚粗记
  20. 软件测试难吗?0基础可以学吗?上手时间快吗?如何从零开始学习软件测试?

热门文章

  1. .net oa 用到那些技术_惨绝人寰!OA高达834分却只配收拒信?
  2. 分布式消息系列:详解RocketMQ的简介与演进、架构设计、关键特性与应用场景
  3. serversql数据库的查询操作
  4. JavaScript中对象的属性:如何遍历属性
  5. JavaMaven【三、常用指令】
  6. SQL 查询CET使用领悟
  7. iOS cocoapods的使用规范说明及示例(.podspec配置文件)
  8. rexpathbs4
  9. Python-二分及bisect模块
  10. 【批处理学习笔记】第二十五课:间接传递