代码改变世界

英语阅读推荐:主题切换控件 & ExpressionBuilder

2006-12-02 22:51  Cat Chen  阅读(3387)  评论(8编辑  收藏  举报

这里是Cat in dotNET的Random Clippings系列,专门向大家推荐.NET相关的英文技术文章,每期推荐两篇文章,第一篇适合于英语技术文章阅读的入门者练习阅读能力,而第二篇则适合于进阶练习与技术学习。

主题切换控件 (Theme Switcher Control)

大家都用过ASP.NET 2.0的主题了吧,在为网站增加几个不同的主题后很多人都会发现了一个问题,那就是系统不提供一个控件给用户自由选择他们当前所想看到的主题。这篇文章告诉你如何继承自ListBox做一个简单的主题切换控件,让用户可以随时更改他们浏览时所选用的主题。

既然是阅读训练专题,那么我们就来慢慢看它的介绍。首先Introduction介绍了这个控件,"persistent through the use of a cookie"让我们了解到用户的选择将通过Cookies来持久。

然后Using the control告诉我们如何使用这个控件,包括添加主题、添加配置信息到web.config和添加控件到页面这3个步骤。这3个步骤对于大家来说都很容易,看着说明来做就是了:

  1. Add multiple themes - 添加多个主题,这个在VS2005中很容易完成,首先通过添加ASP.NET特殊目录添加App_Theme目录,然后在其下面添加子目录作为主题,并且放入相关的css文件和skin文件。
  2. Add the Http Module handler - 添加Http Module配置,这只需要打开web.config并将文章中加亮的代码放到正确的那一节就行了。
  3. Create a page for switching themes - 创建切换主题的页面,这包括通过@Register命令注册控件和使用控件两步,这个控件有两个属性可以设置。
    • "Set the AllowNoTheme property to 'true' if you want to allow the user to choose no theme at all",意思是设置AllowNoTheme属性为true后用户将能够选择无主题。
    • "set the NoThemeText property if you don't want to use the default text 'none'",无主题的选项默认显示为"none",而你可以通过NoThemeText属性更改此文本信息。

注意"Add the Http Module handler"这一节下面有个Warning,"this setting causes a server error in every page having a <head> tag without the runat="server" attribute",意思是说如果页面的<head>标签没注明runat="server"则会导致错误。

接着How it works解释了这个控件是怎么工作的,代码是很容易读懂的。控件继承自ListBox,通过使用IO有关的类遍历App_Theme下的子目录并在ListBox中将它们的名称显示出来,然后根据用户选择保存Cookies。另外还有一个IHttpModule,它在PreRender阶段进行处理,如果处理当前请求的IHttpHandler是一个Page对象,那么它就根据Cookies为此Page应用主题。

最后Known issues,也就是“已知问题”,它说明了如果使用了Server.Transfer则目标Page无法正常应用Theme。为什么呢?大家可以自己思考一下,这和它应用Theme的方式有关。

ExpressionBuilder (The CodeExpressionBuilder)

"A very exciting new feature in ASP.NET 2.0 is Expression Builders",没错,ExpressionBuilder确实是ASP.NET 2.0中一个让人兴奋的新功能,它让我们方便的在SqlDataSource上声明性设置ConnectionString:<%$ ConnectionStrings: MyConnectionString %>,又或者是使用语言资源:<%$ resources: ResourceKey %>。

除了这些功能以外,它还能干什么呢?"Now lets take it one step further",让我们迈步走远一点来看看。

可能很多人都尝试过这样设置属性:Text="<%= DateTime.Now %>",但发现会导致错误。而使用文章中提供的CodeExpressionBuilder后,你可以这样做:Text="<%$ Code: DateTime.Now %>",并且得到你之前预期的效果。

到底这是怎么实现的呢?通过阅读上面引用的文章,你就知道其中的奥妙以及ExpressionBuilder的强大了。Infinities Loop的文章是非常好读的,中间通过大量的加亮代码或截图来解释说明,可以好像看连环画一样仅看图不看字。

最后,如果你觉得Random Clipping的推荐不错,可以考虑长期订阅Cat in dotNET,这样你将不会错过将来的任何一篇推荐。这是我第一次写这个系列,大家有什么好的建议可以直接在评论中写,例如希望更加侧重英语方面的解释或者更加侧重技术方面的解释,又或者希望增加推荐文章的数量,我会根据评论在下一期中改进的。