圓梦

激情燃燒的歲月
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

ASP.NET 2.0 中配合 Master Page 使用的优化 CSS 模型

Posted on 2007-04-27 12:04  szw104  阅读(185)  评论(0编辑  收藏  举报

ASP.NET 2.0 中配合 Master Page 使用的优化 CSS 模型

[日期:2007-02-24] 来源:  作者: [字体: ]

ASP.NET 2.0 中配合 Master Page 使用的优化 CSS 模型

ASP.NET 2.0 中增加了内建的 MasterPage 的支持,这对我们来说是一个很大的便利。然而经过一段时间的使用,我发现 MasterPage 并不是那么完美:嵌套的 MasterPage 不能支持设计时界面,以及下面要提到的Content Page 中增加 CSS 的问题。

通常,在没有 2.0 之前,我们在页面里要增加一个 CSS 引用的语法如下:

<link rel="stylesheet" href="css/test.css" />

 

原本是很平常的做法。但是在一个 MasterPage 的子页面中,出现了一个很尴尬的局面,就是:我们该把上述代码放到什么位置?

因为 MasterPage 的具体内容页面中,只能定义一个个的 <asp:Content /> 标签的内容。我们按照通常的做法在 aspx 里面无法对页面的 <head/> 内容进行控制。而这个 <link/> 标签又必须放在 <head/> 内。我试验过在 <asp:Content /> 内部加入这行代码,但是会提示出错的。

同时,我们也无法在 MasterPage <header/> 内部放好一个 ContentPlaceHolder 用于将来放入 CSS 的引用代码。

因此我的做法是定义了一个 helper 类如下:

static public class ControlHelper

{

    static public void AddStyleSheet(Page page, string cssPath)

    {

        HtmlLink link = new HtmlLink();

        link.Href = cssPath;

        link.Attributes["rel"] = "stylesheet";

        link.Attributes["type"] = "text/css";

        page.Header.Controls.Add(link);

    }

}

 

这样,在具体页面,我们就可以通过如下代码添加 CSS 引用:

protected void Page_Load(object sender, EventArgs e)

{

    ControlHelper.AddStyleSheet(this.Page, "css/projectPage.css");   

}

并且,这个代码支持在具体内容页面,或者一个嵌套的 Master Page 中使用。

 

  当然除了上面的解决方法外,还有一个看起来类似有点奇怪的方法。我们可以在母板的<head></head>之间方式ContentPlaceHolder控件,然后再这里引用CSS样式。之所以称呼它“奇怪”是因为,VS.NET2005在设计视图里会报错,VS2005默认认为控件要放在form之间。这种解决方法并不影响使用。

说到这里也许有人会问,为什么要把 CSS 分开成这样来加载呢?有必要吗?我把所有页面的 CSS 定义到几个公共 CSS 文件里岂不是很好?

其实,熟悉 web 标准的 HTML 制作的朋友一定知道,在比较完美的状态下,页面的 html 和用于表现的 CSS 应该彻底分离。而我们基于 web 标准的设计,通常是先做出一个 Master Page 中各个框架 div 的定位代码,以及 headerfooter 部分的修饰代码。这些是每个内容页面都要用到的,会放在一个统一的 CSS 里面。其他的具体内容页面,每个页面又会有各自不同的内容的布局,修饰样式,因此我把每个具体页面特定的部分放在它自己的 CSS里。这样就形成了一个按照 Master Page 的实现层次(可嵌套),逐层合并的 CSS 模型。其好处是实现了每个 CSS 文件的职责分离,更容易理解和维护。