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事件中使用下面的代码将实际设置的主题写入浏览器。

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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的重大区别) 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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,写入:

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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,类定义代码为:

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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,如何实现?

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   

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》

转载于:https://www.cnblogs.com/partoo/archive/2010/03/10/1682864.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值