TheBeerHouse 网站项目学习笔记(1)----换肤技术

news/2024/5/16 10:32:43/文章来源:https://blog.csdn.net/longxin5/article/details/83613434

 

转自:http://www.bcbbs.net/news/Content31274.aspx

 

 

对于ASP.NET学习的中期,TheBeerHouse 项目是一个不错的选择,这个项目几乎囊括了所有ASP.NET 2.0下所有的技术点,而且其设计的类图架构知识值得我们借鉴.关于此项目的介绍,在此不罗嗦,可以参看如下地址:

  1. 源码下载: http://www.asp.net/Downloads/starter-kits/the-beer-house

  2. 功能技术点介绍: http://www.codeplex.com/TheBeerHouse

  3. 该项目真实网站: http://www.ericengler.com/  (该项目的总体界面可以在此处看到)

  这一篇主要总结该网站换肤技术,如下图的下拉框的功能(由于本总结只有部分代码及其注释,因此需要对照着源码查看)

  一. 文件说明

  整个网站都需要Template.master这个母版页的支持,换肤所用到的文件和技术点

  比较多,先罗列如下:

  1.~/App_Code/BasePage.cs  ---几乎所有页面都继承自此类

  2.~/App_Code/Globals.cs  ---获取自定义配置节,这个自定义配置节被映射到TheBeerHouseSection中

  3.~/App_Code/Helpers.cs  ---提供一些通用方法

  4.~/App_Code/ConfigSection.cs  ---实现自定义的节类型

  5.~/Web.config             ---配置文件

  6.~/Web.sitemap         --网站地图

  7.~/Controls/ThemeSelector.ascx        ---主题选择下拉框(此处做成用户控件)

  8. ~/App_Themes/....      ---该目录下是整个网站主题选择的文件集合,是换肤的"原料",此技术下面会介绍

  9. ~/Default.aspx     --整个网站的首页,也是应用了上述母版也的内容页

  二. 文件说明

  1.BasePage.cs 类说明

  此类是几乎所有内容页(*.aspx.cs)类的父类,也就是说,继承了此类的页面,运行时都得先到这个类来"报到".

  那么此时 protected override void OnPreInit(EventArgs e) 事件就发挥作用了,由于此事件在页面的

  Page_Load事件之前发生,那么我们就以主页Default.aspx的运行流程来查看效果.

  主页Default.aspx基本没有后台代码,它一运行必须先执行BasePage.cs类中OnPreInit事件,代码见下面的流程分析.

  2.Globals.cs说明

  该静态类存放两个静态成员,ThemesSelectorID接受主题下拉框的控件ID,Settings是Web.Config自定义配置节点theBeerHouse的映射,而Setting类型是一个自定义的类TheBeerHouseSection,该类定义是在ConfigSection.cs文件中完成的.

  Globals.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Configuration;
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 MB.TheBeerHouse.UI
{
  public static class Globals 
  {
    public static string ThemesSelectorID = "";
  
    //获取自定义配置节,这个自定义配置节被映射到TheBeerHouseSection中,位于
    //ConfigSection.cs文件中
    public readonly static TheBeerHouseSection Settings =
    (TheBeerHouseSection)WebConfigurationManager.GetSection("theBeerHouse");
  
  }
}

  3. Helper.cs说明

  此类目前就提供一个方法GetThemes,该方法从App_Themes目录中动态获取里面所有的主题名称,并返回一个字符串数组,作为母版页上主题下拉框的数据源

  4. ConfigSection.cs说明    

  Code

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 MB.TheBeerHouse
{
  
  [说明]#region[说明]
  //可以使用 ConfigurationSection 实现自定义的节类型。扩展 ConfigurationSection 类,
  //以提供对自定义配置节的自定义处理和编程访问。
  //http://msdn.microsoft.com/zh-cn/library/system.configuration.configurationsection(VS.80).aspx
  
  //如下两个类需要和Globals.cs配合使用,作用就是在Web.config中使用自定义配置节,
  //并把这个自定义配置节用自定义类的属性表示出来
  
  #endregion
  
  public class TheBeerHouseSection : ConfigurationSection
  {
    //用自定义类ContactFormElement代替节点
    [ConfigurationProperty("contactForm", IsRequired = true)]
    public ContactFormElement ContactForm
    {
      get { return (ContactFormElement)base["contactForm"]; }
    }
  }
  
  public class ContactFormElement : ConfigurationElement
  {
    [ConfigurationProperty("mailSubject",
      DefaultValue = "Mail from TheBeerHouse: {0}")]
    public string MailSubject
    {
      get { return (string)base["mailSubject"]; }
      set { base["mailSubject"] = value; }
    }
  
    [ConfigurationProperty("mailTo", IsRequired = true)]
    public string MailTo
    {
      get { return (string)base["mailTo"]; }
      set { base["mailTo"] = value; }
    }
  
    [ConfigurationProperty("mailCC")]
    public string MailCC
    {
      get { return (string)base["mailCC"]; }
      set { base["mailCC"] = value; }
    }
  }
  
}

  三. 页面主题技术

  本网站使用了两套主题皮肤,这两套主题皮肤名字分别是PlainHtmlYellow 和 TemplateMonster,它们已经在Helper.cs中获取并填充.

  其中Controls.skin文件设定页面控件的外观,凡是看到页面控件HTML部分代码声明中带有SkinID字样的控件就是应用了该皮肤文件中对应控件的外观说明.

  Default.css文件提供不同样式定义,不同的是需要应用该样式的页面不是通过<link> ....... 引用该样式文件的,而是直接通过页面主题访问的,得到了某个主题的页面就可以直接应用该主题里的样式文件和皮肤文件里定义的样式类选择器或者皮肤ID号了.结果是凡是应用了某个主题(如TemplateMonster主题名)的界面,都会应用该主题下所有样式设定,具体技术请查看关于主题设定的相关技术.

  四. 流程介绍

  上述说明,只是文件功能的罗列,我个人感觉还是从运行的主线出发,容易说明上述代码之间的关联关系.

  1. 页面首页是Default页面,此页面后台无任何代码,关键是它继承了BasePage类,按理说首先执行的是BasePage类的OnPreInit事件,该事件重写了Page类的OnPreInit事件,但不然,由于BasePage类需要用到Globals这个静态类,那么第一次运行该网站时(如果不是,把右下角网站图标关闭在启动),其实最先运行的是Gloabals.cs类中的 public static string ThemesSelectorID = ""; 语句,鉴于此,我们可以在如下的地方设置两个个断点:

  (1) Globals.cs 中在 public static string ThemesSelectorID = ""; 上设置断点           

  (2) BasePage.cs中 string id = Globals.ThemesSelectorID; 上设置断点      ‚     

  好,现在来看运行流程:

  首先运行到断点, 声明一个静态成员变量ThemesSelectorID 用来保存页面上改变主题的控件的ID,接着获取自定义配置节,这个自定义配置节被映射到类TheBeerHouseSection中,位于ConfigSection.cs文件中,这里有些难以理解,需要同时对照着Web.Config,ConfigSection.cs,和此段代码来理解,具体解释见上述Globals.cs详细代码注释.

  2. 接着跳入BasePage类的OnPreInit事件,下面的代码可以单步调试看运行状况,注释在BasePage类中已经说明的很详细,如下:

BasePage.cs
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 MB.TheBeerHouse.UI
{
  public class BasePage:System.Web.UI.Page
  {
  
    protected override void OnPreInit(EventArgs e)
    {
      string id = Globals.ThemesSelectorID;
      if (id.Length > 0)
      {
  
        //如果这次回传是由方案选择下拉框选择后引起的刷新,那么就将此次选择的方案
        //应用上去,并将此次的方案存入个性化配置中,ProfileCommon是在运行的
        //时候产生的一个类,Preferences是Web.Config配置节中的一个Profile下的一个扩展
        //Group节点,专门用于存储方案和本地资源的语言
        //判断此事件是否是由于选择皮肤的下拉框控件引起的回发
        //如果是,就将页面主题 this.Theme修改为选择的主题名称,也就是
        //App_Themes 中某个目录名称 PlainHtmlYellow / TemplateMonster,否则
        //直接到会话中去取主题的值
  
        if (this.Request.Form["__EVENTTARGET"] == id && !string.IsNullOrEmpty(this.Request.Form[id]))
        {
          this.Theme = this.Request.Form[id];
          (HttpContext.Current.Profile as ProfileCommon).Preferences.Theme = this.Theme;
        }
        else
        {
          // if not a postback, or a postback caused by controls other then the theme selector,
          // set the page's theme with the value found in the user's profile, if present
          if (!string.IsNullOrEmpty((HttpContext.Current.Profile as ProfileCommon).Preferences.Theme))
            this.Theme = (HttpContext.Current.Profile as ProfileCommon).Preferences.Theme;
        }
      }
      
      base.OnPreInit(e);
    }
  
  }
}

 

  其实换肤并且下次在启动可以自动记住上次换肤的结果的关键代码就是上面代码的如下语句:

this.Theme = this.Request.Form[id];     (1)
(HttpContext.Current.Profile as ProfileCommon).Preferences.Theme = this.Theme; (2)
 this.Theme = (HttpContext.Current.Profile as ProfileCommon).Preferences.Theme; (3)

  前两条语句和第三条语句分别位于If和Else中,  (1) 用于将下拉框选择的值赋予当前页面的主题属性

  (2)用于保存当前主题到个性配置中(关于个性配置知识点请参考我有关权限管理的两篇文章以及本学习笔记的下一篇),以便下次运行具有记忆主题的作用,此语句在(3)中实现

  而页面在第一次匿名启动时用到的主题是在Web.Config中配置节

  <pages theme="TemplateMonster" masterPageFile="~/Template.master"/> 中实现的.

  这篇就介绍到这里,其实很多知识点还是自己边运行边理解的,由于本人表达能力有限,所以显得有些罗嗦,希望对些许人有帮助.就其价值而言,这些讨论其实还是有些表面工作的意思,因为毕竟我们还是在讨论应用级别的论题,也就是强调会的角度,而理论理解的东西可以参考博客园里排名靠前的牛人们的见解.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_813754.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目管理实践【五】自动编译和发布网站

转自&#xff1a;http://www.cnblogs.com/ttzhang/archive/2008/11/10/1330321.html 在上一篇教程项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】 中&#xff0c;我们讲解了如何使用CCNETMSBuild来自动编译项目&#xff0c;今天我们讲解一下怎…

传AOL将收买博客聚合网站Outside.In

网易科技讯 3月4日动静&#xff0c;据国外媒体报道&#xff0c;据业内一位知恋人士吐露&#xff0c;美国在线公司(AOL)将于美国时间往日宣布揭晓&#xff0c;该公司已收买"超当地化&#xff08;Hyper-Local&#xff09;"博客聚合网站Outside.In。眼前当今尚不分明美国…

Java版PageRank及网站收录情况查询代码

在Google这个由10的100次方得名的站点中&#xff0c;各种评估网站的算法层出不穷&#xff0c;而PageRank即是其中之一。Google的PageRank根据网站的外部链接和内部链接的数量和质量俩衡量网站的价值。PageRank背后的概念是&#xff0c;每个到页面的链接都是对该页面的一次投票&…

H标签在SEO中的应用方法

转载于:https://www.cnblogs.com/vger/archive/2011/06/27/2091456.html

把网店开到美国去--个人网店(自己制作的电子商务网站)

吾阅&#xff1a;借助支付宝等成熟线上支付工具和带独立域名的C2C网店不但多了个性化&#xff0c;而且有进一步发展壮大的可能。 所售商品也不局限于实物&#xff0c;你的摄影作品和小软件都可以找到买家。 如果你有程序设计的天赋&#xff0c;App Store绝对就比ebay强&#…

关于IIS7发布网站

用IIS7 发布网站的时候&#xff0c;出现这个错误&#xff0c;一般将这个连接池“高级设置” &#xff0c;托管管道模式&#xff0c;由Intergrated 改为Classic 类型。 转载于:https://www.cnblogs.com/withoutaword/archive/2013/01/30/2883223.html

中文域名在SEO上的威力!

吾阅&#xff1a;有待验证&#xff1b; 中文域名在SEO上的威力&#xff01; 转自&#xff1a;http://富妈妈.net/20100524/330.html 5月21日着手将博客转移到自己的中文域名&#xff1a;http://富妈妈.net。5月22日周六陪孩子&#xff0c;抽空搜索了一下&#xff0c;发现已经…

百度推出开放平台 或颠覆下载网站等六大行业

百度推出开放平台 或颠覆下载网站等六大行业 2010年08月27日07:08腾讯科技李乐东 雷建平 吾阅&#xff1a;百度的框计算&#xff1f;谁说技术没有用&#xff1f;要是搞个搜索出来&#xff0c;全国都被你统治&#xff1b; 转自&#xff1a;http://tech.qq.com/a/20100827/000115…

WordPress SEO by Yoast 插件安全绕过漏洞

漏洞名称&#xff1a;WordPress SEO by Yoast 插件安全绕过漏洞CNNVD编号&#xff1a;CNNVD-201304-177发布时间&#xff1a;2013-04-12更新时间&#xff1a;2013-04-12危害等级&#xff1a; 漏洞类型&#xff1a; 威胁类型&#xff1a;远程CVE编号&#xff1a; WordPress SEO…

bootstrap弹窗_响应式网站制作之响应式视频弹窗实现

很多网站都有视频播放的功能&#xff0c;有些视频播放需要外链出去播放&#xff0c;不太影响网站的加载和网站的使用流量&#xff0c;有些则需要到本地播放&#xff0c;极大的影响了网站的加载和流量的使用&#xff0c;而有些网站还有一系列的视频列表页&#xff0c;这样的情况…

一个使用Ruby on Rails开发LBS网站的简单实例

一个使用Ruby on Rails开发LBS网站的简单实例 cheungmine 2011-7 这几天一直在学习使用Ruby on Rails(RoR)&#xff0c;想建立一个功能全面一点的LBS(Location Based Service)网站。但是对于我这个RoR的初学者&#xff08;仅有几天时间&#xff09;来说&#xff0c;毕竟太复杂…

[网站公告]23:00-05:00阿里云SLB升级会造成4-8次每次10秒的闪断

大家好&#xff0c;阿里云将于今天夜里&#xff08;7月29日23:00-7月30日05:00&#xff09;对负载均衡服务&#xff08;SLB&#xff09;进行升级操作&#xff0c;升级期间我们使用的SLB实例会有4-8次的闪断&#xff0c;每次闪断时间10秒左右。闪断期间会造成网站不能正常访问&a…

网站安全通用防护代码(C#版本源码提供)

每一个开发者都会意识到&#xff0c;网站发布之前&#xff0c;需要进行安全检查。 那么如何拦截攻击者注入恶意代码&#xff1f;如何防御诸如跨站脚本攻击&#xff08;XSS&#xff09;、SQL注入攻击等恶意攻击行为&#xff1f; 针对目前常见的一些安全问题&#xff0c;结合目前…

网站策划方案写作、演示标准

一份成功的网站策划方案是赢得订单的重要砝码&#xff0c;如何写一份令客户心动的网站策划方案则需要下苦功夫。《网站策划方案写作、演示标准》主要分为7个部分&#xff0c;希望对您有帮助&#xff1a;1. 网站策划方案的价值——内容重点阐述了解决方案能给客户带来什么价值&a…

网站策划方案写作、演示标准

一份成功的网站策划方案是赢得订单的重要砝码&#xff0c;如何写一份令客户心动的网站策划方案则需要下苦功夫。《网站策划方案写作、演示标准》主要分为7个部分&#xff0c;希望对您有帮助&#xff1a;1. 网站策划方案的价值——内容重点阐述了解决方案能给客户带来什么价值&a…

理解 Ajax 及其工作原理,构建网站的一种有效方法

理解 Ajax 及其工作原理&#xff0c;构建网站的一种有效方法 Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成&#xff0c;这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本文的作者是一位 Ajax 专家&#xff0c;他演示了这些技术如何协同工作 —— …

Android技术开发 必备网站及使用工具

【前言】工欲善其事&#xff0c;必先利其器。搞开发多年了&#xff0c;会收藏一些干货网站和工具&#xff0c;辅助开发&#xff0c;提高开发效率。下面一次性分享给大家。喜欢的朋友们点个赞吧。 说明&#xff1a;这些是我收藏的网站&#xff0c;感觉还是不错的&#xff0c;仅仅…

webgis本地部署之在IIS6,7中部署ASP.NET网站

阅读目录 开始查看web.config文件在IIS中创建网站IIS6 添加扩展名映射IIS6 无扩展名的映射目录的写入权限SQL SERVER的配置在IIS7中部署ASP.NET程序80端口和域名 在我的第一篇博客中&#xff0c;我发布过一个示例项目&#xff0c; 主要演示了我的我的AJAX框架和我的通用数据访问…

从外网访问内网本机的网站实现方法

这是一个比较古老的话题了。一般懂得搭建网站的朋友&#xff0c;应该都会有分享自己小站的冲动。一来可以展示自己的作品&#xff0c;二来也可以方便别人看看网站&#xff0c;提提意见。呵呵。 鉴于网上类似的详细教程真的很少&#xff0c;也许是问题太简单了吧。但仍然有不少…