ASP.net 学习笔记之主题
关于主题(Theme)
一个基本约定是,不在母版中设置主题。
主题设置方法
1、默认方法:刷新程序
在@Page指令中设置。
<%@ Page Theme="myFirstTheme" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Page StyleSheetTheme="myFirstTheme" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
Theme与StyleSheetTheme两者区别是优先级不同:
加载的顺序是:StyleSheetTheme ----->页面中的样式 -----> Theme .
最后显示是:取三者合并,同样的定义依次加载,后者(Theme最高)会取代前者。另外,Theme在设计视窗中不会即时显示效果(所见即所得),而StyleSheetTheme则可以。
这种方法的优点是简单,缺点显而易见:维护起来麻烦,如果有1000页的话?如果有多种主题呢?
2、编程方式:
i.Theme方法
页面生命周期中的Page_PreInit事件:Page_PreInit事件是.NET 2.0 Framework中引入的新事件,是在代码中能够访问的第一个事件(它在Page_Load或者Page_Init事件之前激活)。和母版页一样,如果要以编程方式设置主题,那么就必须在Page_PreInit事件中设置它们。
protected void Page_PreInit(object sender, EventArgs e) {
Page.Theme = "myTheme";
}
protected void Page_PreInit(object sender, EventArgs e)
{
if (Page.Request.Browser.Browser == "IE")
{
Page.Theme = "myFirstTheme";
}
else
{
Page.Theme = "";
}
}
另外有必要指出的是,这种方法允许在项目中使用Theme设置作为自身的标准。例如,可以在Page_Load事件中使用下面的代码将实际设置的主题写入浏览器。
protected void Page_Load(object sender, EventArgs e)
{
if (Page.Theme != "")
{
Response.Write("<p>Theme: " + Page.Theme + "</p>");
}
else
{
Response.Write("<p>Theme: No Theme Has Been Set</p>");
}
}
为什么不在Master中设置主题?因为Master没有Page_PreInit事件。
ii.StyleSheetTheme方法(与Theme的重大区别)
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;
public partial class _Default : System.Web.UI.Page
{
public override string StyleSheetTheme
{
get
{
if (Page.Request.Browser.Browser == "IE")
{
return "myFirstTheme";
}
else
{
return "";
}
}
set
{
base.StyleSheetTheme = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (Page.StyleSheetTheme != "")
{
Response.Write("<p>StyleSheetTheme: " + Page.StyleSheetTheme + "</p>");
}
else
{
Response.Write("<p>StyleSheetTheme: No StyleSheetTheme
Has Been Set</p>");
}
}
}
优点:控制灵活。
缺点:大量代码驻留在每个页面。
如果@Page中与Page_PreInit同时设置Theme,谁会被执行呢?是Page_PreInit!
3.全局设置主题
i.Web.config
<system.web>
<pages theme="myFirstTheme"/>
</system.web>
或者
<system.web>
<pages styleSheetTheme="myFirstTheme"/>
</system.web>
注意:Web.config文件内容区分大小写,如果属性输入StyleSheetTheme(styleSheetTheme)则无效。
如果Web.config文件/@Page/Page_PreInit同时指定主题,顺序是:
Web.config-----@Page-----Page_PreInit(由低到高),也就是说,web.config可以全局定义,但是,一样可以为单一文件指定Theme。
ii.machine.config
web.config只影响单个web应用,如果需要指定特定web服务器上所有web应用,使用machine.config.
4.继承的基类
混合编程与全局的方法。
建立1个新类,PageBase.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;
/// <summary>
/// Summary description for PageBase
/// </summary>
public class PageBase : Page
{
protected void Page_PreInit(object sender, EventArgs e)
{
Page.Theme = "myFirstTheme";
}
}
删除其他位置(@Page,Web.config,Page_PreInit,Machine.config)的指定;
最后,在页面中添加PageBase继承:
public partial class _Default : PageBase
如果使用styleSheetTheme属性替代Theme,类定义代码为:
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;
/// <summary>
/// Summary description for PageBase
/// </summary>
public class PageBase : Page
{
public override string StyleSheetTheme
{
get
{
return "myFirstTheme";
}
set
{
base.StyleSheetTheme = value;
}
}
}
如果,在此基础上(基于Theme属性)再设一个主题theme2,如何实现?
public partial class _Default : PageBase
{
protected void Page_PreInit(object sender, EventArgs e) {
base.Page_PreInit(sender, e);
Page.Theme = "theme2";
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
如果不调用base.Page_PreInit(sender,e)则会出错。这说明,使用类的方式,如果两个位置同时调用,则有一个会完全忽略。所以需要首先调用基类中的Page_PreInit事件,然后再运行页面中的代码。
上述代码的另一个问题是,VS代码视图中会出现波浪线(警告),需加new 关键字
protected new void Page_PreInit(object sender, EventArgs e)
{
base.Page_PreInit(sender, e);
//Page.Theme = "mySecondTheme";
}
使用StyleSheetTheme没有上述的麻烦。
摘录自《ASP.NET Web界面设计三剑客:CSS、Themes和Master Pages》