当前位置: 首页 > news >正文

DNN中的Skinning系统

Skinning 早有耳闻。但很汗的是, DNN 才是我接触过的第一个采用 Skinning 的项目。所谓 Skinning 就是实现功能和外观的分离。但由于接触 Asp.net 不多。看了挺长时间 DNN 了,现在才对整个 Skinning 系统有了一定的理解。
DNN 中,所谓的皮肤由两部分组成。即 skin container 。由于这是 DNN 的标志性功能。对这些讲解的文章很多。在 /Documents/DotNetNuke Skinning 中,我觉得讲的已经足够清楚了。我想写的是整个页面的绘制过程。
1.             首先,从键入一个 Url 开始。这个 Url 将会被 UrlRewriteModule 类率先获得。并利用 Asp.net 所支持的 Url 重写系统对一个 Url 进行重写。我一直对这个重写机制有着很多的疑问。但在看完后,很多疑问都得以解决。推荐和我一样对 Url 重写不大了解的人看下这篇文章。 DNN Url 重写几乎是按照这篇文章的标准格式完成的。
2.             重写完毕的 Url 将被定位到一个页面上,一般是 Default.aspx 页面。这个页面的后台类是 Cdefault 。这个类的 LoadSkin方法将加载skin。Skin的路径一般会在PortalSettings.ActiveTab.SkinSrc中。Tab才是真正的页面标示,因为几乎所有的页面都是在Default.aspx上动态绘制,只有通过Tab来区分。在数据库中,我们可以看到Tabs中存放着skinsrc和containersrc。在TabModules中,保存着每一个Tab的模块及其位置。
3.             在每一个Skin,即每一个Skin.ascx的后台类都是Skin。它会取出所有页面上ID为contentpane,leftpane,rightpane,topane,bottompane。的td,span,div,p。(ID必须唯一)并取出相应的container放进去。并且在每个container中ID为contentpane的控件上放入相应的module。这样就绘制出了整个页面。
原来我以为会在Default.aspx的后台类中加载skin,container,module。但它只在其中完成了skin的加载,大部分的功能都在skin.ascx的后台类中完成。我想这样设计自然会有它的理由。也许是为了集中控制。希望能听到高人的理解。
给我最大的启发就是要想实现功能部件的分离,和动态的组装。必须有一定的语法规则。就是通过彼此都默认的字串把各部件联系在一起。同时还要有从字串生成对象或是调用功能的能力。从skinning中可以看到。类似于Contentpane这样命名规则必须遵守,同时还要有Loadcontrol(controlpath as string) as usercontrol这样由字串直接加载成控件的能力。在.net中提供了很多这样的机制,如反射。这种机制的引入,通常会提高灵活性,但也免不了会付出一些代价,使用时要根据需求,权衡利弊。









本文转自 duguguiyu 51CTO博客,原文链接:http://blog.51cto.com/duguguiyu/362841,如需转载请自行联系原作者

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • nginx知识总结
  • 关于外键约束和对应主键信息的查询脚本
  • struts2知识复习之二
  • 将链表逆序(Revert)的C#实现
  • 高中数学中需要重点关注的函数和图像
  • 如何实现DES算法
  • TensorFlow系列专题(三):深度学习简介
  • top命令解析
  • Tensorflow 笔记
  • 经典总结:PERL中用DBD:ORACLE模块的权限问题
  • 许昌五女店考场考试安排
  • perl链接数据库实例
  • android的四种线程池
  • mybatis0210 mybatis和ehcache缓存框架整合
  • 激活 win10 企业版2016长期服务版本
  • 【css3】浏览器内核及其兼容性
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • css的样式优先级
  • ES2017异步函数现已正式可用
  • express如何解决request entity too large问题
  • Facebook AccountKit 接入的坑点
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java应用性能调优
  • WebSocket使用
  • 成为一名优秀的Developer的书单
  • 创建一个Struts2项目maven 方式
  • 从tcpdump抓包看TCP/IP协议
  • 代理模式
  • 工作中总结前端开发流程--vue项目
  • 前嗅ForeSpider中数据浏览界面介绍
  • 时间复杂度与空间复杂度分析
  • 移动端唤起键盘时取消position:fixed定位
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • # C++之functional库用法整理
  • #ifdef 的技巧用法
  • #QT(TCP网络编程-服务端)
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #数据结构 笔记三
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1)Nginx简介和安装教程
  • (6)添加vue-cookie
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (LeetCode) T14. Longest Common Prefix
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (算法)Travel Information Center
  • (学习日记)2024.01.09
  • (一)VirtualBox安装增强功能
  • (转)winform之ListView
  • (转载)深入super,看Python如何解决钻石继承难题