在有的网站上,允许用户根据自己的喜好来更改皮肤,这个功能利用ASP.NET的主题机制可以方便的实现,在C#代码中可以通过Page类的Theme属性改变页面的主题,代码如下:

   Page.Theme ="要设置的主题名称";

要想改变主题,第一个直观的思想就是在页面中添加一个DropDownList控件,然后用户通过选择相应的主题。 然后增加一个按钮,在按钮的Click的事件中根据用户的选择来进行修改。但是这个思路并不可行,因为根据对ASP.NET页面生命周期的分析,当处理Button的click事件时,页面主题已经应用完毕(因为控件的初始化在PreInit事件发生之前),此时修改

主题不可行。一个可行的思路就是必须在PreInit事件触发是选择好页面的主题值。然后在页面生命的早期阶段(PreInit事件中),无法读取用户控件的状态,显然这是一组矛盾。所以这里需要一些技巧来解决这个矛盾。

  也行很快地就想出第二种方式,就是利用C#的事件处理,通过在按钮的事件中重新触发一次PreInit事件,代码如下:

  protected void Page_Load(object sender, EventArgs e)
        {

       this.PreInit += new EventHandler(Page_PreInit);

        }

 protected void Page_PreInit(object sender, EventArgs e)

{

  this.Theme = DropDownList1.SelectedValue;

}

从实际的运行结果来看,这个方案也不可行,因为在页面生命周期中,PreInit事件先运行,这时候并不知道控件DropDownList的状态,所以矛盾没有解决。

      第三种方案就是把用户所选择的主题作为一个QueryString参数传递,然后在Page类的PreInit事件中读取此参数并修改主题。

假设已创建了两个主题:GrassGreen 和SkyBlue,在添加一个客户端按钮,并为此按钮编写JavaScript脚本。代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ThemePage.aspx.cs" Inherits="ExampleChapter1Dot9.ThemePage" Theme="GrassGreen" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>动态更改主题</title>
    <script type="text/javascript" language="javascript">
        function changeTheme() {
            //获取当前所选的主题
            var theme = document.getElementById('<%=DropDownList1.ClientID %>').value;
            //重新加载当前画面,并通过QueryString 传递所选中的主题
            window.location = "ThemePage.aspx?theme=" + theme;
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        请选择一个主题:<asp:DropDownList ID="DropDownList1" runat="server">
        <asp:ListItem Value="GrassGreen">草绿色</asp:ListItem>
        <asp:ListItem Value="SkyBlue">天蓝色</asp:ListItem>
        </asp:DropDownList>
        <br />

      <asp:Button ID="Button1" runat ="server" Text="更改主题" onclick="Button1_Click" />
        <input type="button" value="更改主题(客户端Button)" onclick="changeTheme()" />
    </div>
    </form>
</body>
</html>

在.CS文件中

protected void Page_PreInit(object sender, EventArgs e)
        {
            this.Theme = Request.QueryString["theme"] ?? "SkyBlue";
        }

第三种方案可以解决动态的改变主题。

个人总结,在读取控件或者改变控件状态时,必须考虑到页面生命周期,这个也是学习ASP.NET必须记住的过程。