15.3 动态选择母版页
【本节示例参考:\示例代码\C15\SeletctMasterPage】
有时候,网站中存在两个母版页,内容页面需要根据不同的情况选择不同的母版页。例如,对于eBooks系统来说,假设有两类用户使用系统。
(1)已登录的用户:母版页上显示导航信息。
(2)未登录的用户:母版页上显示一个“注册会员”链接。
实现后的页面如图15.11所示。
图15.11 根据用户是否登录自动选择不同的母版页
想要实现这一功能,可使用内容页的PreInit事件,改变页面的MasterPageFile属性。下面的示例,将完成这个功能。
1.创建两个母版页
创建示例SelectMasterPage,按照【15.1.1】节步骤添加两个母版页MasterPage_LoginUser和MasterPage_GuestUser,其中前者与前面几节示例中的母版页相同,后者源代码如下。
代码15-9 未登录用户的母版页:Computer.aspx
1. <div>
2. <table border="1px" style="width: 80%; height: 100%;">
3. <tr>
4. <td colspan="2" align="center">
5. <img src="images/book_room.JPG" alt="logo" />
6. </td>
7. </tr>
8. <tr>
9. <td align="left">
10. <a href="#">注册成为会员吧!</a>
11. </td>
12. <td>
13. <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
14. </asp:ContentPlaceHolder>
15. </td>
16. </tr>
17. <tr>
18. <td colspan="2" align="center">
19. ©2007 MyBookRoom
20. </td>
21. </tr>
22. </table>
23. </div>
与已登录用户母版页的区别主要在于去掉了左侧的超级导航,取而代之是一个“注册会员”链接。
2.模拟登录页面
本例中,不真正实现用户登录功能,仅仅利用Default.aspx页面进行简单的模拟。放置两个按钮在上面,代码如下。
代码15-10 用户模拟登录的页面:Default.aspx
1. <div>
2. <asp:Button ID="ButtonMember" runat="server" OnClick="ButtonMember_Click" Text="以会员身份进入" />
3. <asp:Button ID="ButtonGuest" runat="server" OnClick="ButtonGuest_Click" Text="以游客身份进入" />
4. </div>
两个Button控件ButtonMember和ButtonGuest的功能是,将页面跳转到Computer.aspx页面上,不过ButtonMember首先创建一个Session变量login,并赋值为true以表示用户已经登录;而ButtonMember则赋值为false。两者的单击事件如下。
代码15-11 用户模拟登录的页面:Default.aspx
1. /// <summary>
2. /// “以会员身份进入”单击事件
3. /// </summary>
4. protected void ButtonMember_Click(object sender, EventArgs e)
5. {
6. Session.Add("login", true);
7. Response.Redirect("Computer.aspx");
8. }
9.
10. /// <summary>
11. /// “以游客身份进入”单击事件
12. /// </summary>
13. protected void ButtonGuest_Click(object sender, EventArgs e)
14. {
15. Session.Add("login", false);
16. Response.Redirect("Computer.aspx");
17. }
3.利用Pre_Init事件选择母版页
添加Computer.aspx页面,并选择默认的母版页为MasterPage_GuestUser.master,然后在其PreInit事件中,实现根据用户是否登录自动选择母版页的功能。
代码15-12 自动选择母版页:Computer.aspx
1. /// <summary>
2. /// <summary>
3. /// 根据用户是否登录选择母版页
4. /// </summary>
5. protected void Page_PreInit(object sender, EventArgs e)
6. {
7. if (Convert.ToBoolean(Session["login"]))
8. Page.MasterPageFile = "~/MasterPage_LoginUser.master";
9. else
10. Page.MasterPageFile = "~/MasterPage_GuestUser.master";
11. }
第7行判断了Session变量login是否为真,如果为真则利用Page的MasterPageFile属性,指定页面的母版页为MasterPage_LoginUser;反之,指定为MasterPage_GuestUser.master。
为什么需要使用页面的PreInit事件,而不能用Load事件或Init事件?这是因为页面在Load或Init页面之前,就已经和母版页融合在一起。
承上启下
¢ 学完本章后,读者需要回答:
1.母版页有何作用?
2.如何创建一个母版页,并利用其使多个页面具有统一的布局?
3.母版页和内容页是如何融合在一起的?
4.母版页和内容页融合在一起的时候,各自的生命周期事件顺序是怎样的?从这个角度上,应该将母版页视为普通.aspx页面,还是一个用户控件更合适?
5.如何在母版页内部使用控件触发事件?
6.如何在母版页中访问内容页中的控件?反之如何实现?
7.如何利用编程的方式,动态的为内容页选择不同的母版页?
¢ 在下一章中,读者将会了解:
1.ASP.NET 2.0导航系统的机制。
2.利用站点地图SiteMap导航系统页面。
3.利用默认的Map.sitemap文件设置站点地图数据。
4.使用默认的方法读取Map.sitemap文件,并用SiteMapPath、TreeView及Menu导航控件,实现网站的导航。
5.为网站配置多个站点地图。






