内容页中调用母版页控件一些方法总结

 在内容页中调用母版页控件


1、在内容页中有个属性Master,可以通过它访问母版页。如我们要修改母版页上的标题,我们看到显示标题的那个

       Label的ID为Label1,则在Page_Load事件中增加以下代码:

      protected void Page_Load(object sender, EventArgs e)
     {
            if (!IsPostBack)
                   ((Label)Master.FindControl("Label1")).Text = "标题被修改了!";
      }


2、是服务器控件或者凡是runat=server的控件,其ClientID在页面输出后,都跟在设计时不一样了。例如有个

      <input type="text" id="txtName" runat="server" />
      但输出后,却变成了
      <input type="text" id="ctl00_Main_txtName" />
      如果你原本在javascript里如下引用:document.getElementById("txtName");现在多半找不到了。可以沿用ASP的做法:
      document.getElementById("<%=txtName.ClientID%>");

3、内容页要访问母版页上的控件不象在同一页上那么方便。 需要用Page.Master.FindControl();的方式,例如,
       TextBox txt = (TextBox)Page.Master.FindControl(“txtName”);
       假如要访问的控件是用户控件,如果这样写:
       MyCtrl myctrl = (MyCtrl)Page.Master.FindControl(“MyCtrl1”);
       多半会编译出错,说缺乏MyCtrl的定义。原因是该控件在母版页上声明: 
       <%@ Register Src="myCtrl.ascx" TagName="myCtrl" TagPrefix="uc1" %>
       一般情况下在内容页就不用再声明了。但如果要访问它就不同,也要在内容页的头部加上这一句才行。

       如果用户控件类名是Control_myCtrl,ID为MyCtrl,则在内容页用

      ASP.myCtrl  myCtrl=(ASP.myCtrl)Master.FindContrl("MyCtrls 1")就可以进 行引用了。

4、要支持在母版页上的控件事件怎么办?
      比如说,我要在内容页支持我自己写的用户控件MyCtrl(在母版页)的OnClick事件该怎么办?总不能将代码写在母版页吧?

      别忘了,事件本质是委托,我们只要在内容页添加对该事件的委托就行了。
      以前1.1的时候,代码页面有Page_Init事件的代码,可2.0就不知道跑哪去了。幸而自己加上去也有效:
      protected void Page_Init(object sender, EventArgs e)
     {
           MyCtrl myctrl = (MyCtrl)Page.Master.FindControl(“MyCtrl1”);

           if (myctrl != null)
                 myCtrl.Click += new MyCtrl.ClickEventHandler(MyCtrl1_Click);
      }

 

使用母版页时内容页如何使用css和javascript

由于网站的主要频道页和列表页的头部和底部都是一样的,如果将每个页面放在单独的页面中,当头部和底部需要更改时维护量太大。于是想把头部和底部做成母版页,频道页和列表页的具体内容放到内容页中。这样当头和底需要改动时,只要修改一下母版页就可以了。

好处有了,问题也接着来了。原来在频道页和列表页中有其各自的css引入和一些javascript函数,当使用母版页时,放在内容页中这些css样式和javascript函数怎么处理呢?因为大家知道,使用母版页的内容页是不能包含<head></head>标记的,而css和javascript函数的声明是要放到<head></head>中间的,这些css样式和javascript函数如何处理呢?上网查了一下,大致有三种解决方案:方案一:把所有的css样式和javascript函数放到母版页的<head></head>中,我觉得这样做的弊端就是导致母版页的<head></head>区特别臃肿,同时如果原来两个频道页中包含同名的css声明或javascript函数,但却是不同样式或执行不同操作,怎么办呢?所以这第一种方案很快被我否定了。方案二是在内容页的PageLoad事件中通过代码来指定本内容页的css文件。具体代码如下:

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");   
}
这种解决方案的好处时可以在程序运行时动态更改所需的css文件,但是对javascript函数处理起来该怎么做呢?再说有必要把本该加在html代码中的css和javascript通过cs代码来加入吗?因此,这种解决方案也很快被我否定了。剩下的第三种解决方案就是在母版页的<head></head>中添加一个内容控件,然后在内容页中在对应的内容控件中写css和javascript代码。听起来这个这个解决方案应该是最方便,最适宜的解决方法。可是当我把ContentPlaceHolder控件拖放到<head></head中间时,vs2005却报了下面的错误:

白天的时候,看到这我就以为这种方法行不通了,差点就放弃了。晚上回家想找找更好的解决方案,可所有的文章基本上都是说的前两种,对第三种解决方案有人说报错,不行。看来碰到这个提示后放弃的人还真不少。我没理这个错误,直接转到内容页,,在内容页中插入以下代码:

看了一下,内容页中没有报错,看来有戏。可转到内容页的设计视图一看,出现了如下界面:


心凉了一下,因为没看到我上面应用的css样式的效果,我的css文件的代码如下:
#content
{
     text-align:center;
     width:200px;
     height:100px;
     background-color:#00FF00;
     color:#FF0000;
     font-size:12px;
}
也就是让id为content的div宽度200px,高度100px,文字居中,背景颜色为为绿色,字体为红色,12px。不甘心的我按下了F5调试键,令人惊喜的一个画面出现了:
这说明css应用成功了,同时也看到了那个测试可爱的hello world对话框alert了出来。成功了!
总结一下,其实很多人开始的想法和我一样,想如何用最简单的方法实现在内容页中使用css和javascript的功能。他们中的很多人可能也找到我找到的那篇文章,但是当碰到我的那个母版页中的错误提示后就放弃了,也许有人坚持到了第二步,可是在设计视图中没看到css的应用效果后可能也放弃了。其实只要在坚持一下就成功了!余世维说的好“比别人多想一点,你就能成功!”,确实很有道理啊。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gz2008gz/archive/2009/08/06/4413268.aspx

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值