一直都觉得Asp.net的母版页就是个Bug般的存在,简化UI编程、使得某些通用编程成为可能。
母版页主要实现方式是通过ContentPlaceHolder与Content配合来作用的,待会的后台编程也会体现这点。一般在内容页中要指明它引用的母版页(设置MasterPageFile),所以对于内容页来说母版页是明确的,而母版页却不明确内容页的信息,所以知道这种关系,在编程中的思路就要清晰点了。
费话不多说,一般母版页可以有以下用法:
1.内容页访问母版页
一般只要将this.Master向下转型为指定的母版页类型的对象,然后像操作一般对象一样调用里面的方法、访问里面的控件、属性之类,这没什么好说的。主要这样做可以方便母版页内容跟着不同内容页发生一定的变化,比如可以向母版页里的数据对象(用ViewState保存了的)添加一些数据(像跟踪信息或其它),或者影响某部分UI呈现等。注意像Theme更换不能这样做,后面会讲解为什么。
2.母版页访问内容页
这个比较麻烦一点,一般访问控件就是this.ContentPlaceHolder1.FindControl("xxx")然后强制转换一下,访问属性或方法就是利用反射技术,this.ContentPlaceHolder1.Page.GetType(),然后就是些GetProperty()之类。使用这种母版页访问内容页方式,多是一些设置内容页通用功能。比如在部分页面上要实现通用跳转,如果一个个去配,一是麻烦、二是不易维护,这时把这种东西在母版页里编写就方便多了。不过这种通用一般都要把上面说的访问控件与访问属性的技术结合使用。不会反射的同学,你还是老实点好了。
3.嵌套母版页
这个就是母版页里套母版页,比如说MainMenu可以放在一个母版页里,网站的某个子版块的SideMenu就可以在这个母版页里再定义一个母版页来实现。具体的做法可以参考MSDN上的链接嵌套的 ASP.NET 母版页
一般母版页都可以划归以上几类。最后要说下的就是上面说的一个Theme更换问题。一般人做主题更换或子版块主题不同时都会想着,只要css引用不同就行了,所以在母版页Load或更早的事件里改下css链接就行了。如果skin里的样式也写定义到了css中的话,这样做的话也可以。但是这样做的话破坏了Asp.net的主题应用体系,如果skin里的某些属性又好死不活的不能写到css里,那问题就大了。但是了解Asp.net页生命周期的同学都知道,我们要改Theme引用必需在Page_Init事件里。但是母版页里又偏偏没有这个事件,怎么办。好,当这个时候,我们一般就要用到另一个解决通用问题的方法了——继承。定义一个继承至Page类的子类,然后其它具体页的后台类都继承至这个类就行了。
好了,母版页什么的就总结到这里,像什么母版页生命周期的内容,我想以后放在Asp.net的一些重要处理流程中进行总结,这个就到这了。