• 041. asp.net中内容页访问母版页中的控件


    母版页运行机制:

    用户通过输入内容也的URL来请求某个页面, 获取该页面后, 读取@Page指令, 如果该指令引用了一个母版页, 则也读取该母版页, 如果也是第一次请求这两个页面, 则母版页和被请求的页面都要进行编译; 包含更新的内容的母版页合并到内容页的控件树中, 各个Content控件的内容合并到模板页中相应的ContentPlaceHolder控件中, 浏览器中呈现得到的合并页;

    母版页的优点:

    使用母版页, 可以为ASP.NET应用程序页面创建一个通用的外观, 开发人员可以利用母版页创建一个单页布局, 然后将其应用到多个内容页中.母版页具有下面的优点:

    使用母版页可以集中处理页的通用功能, 以便只在一个位置上运行更新, 在很大程度上提高了工作效率. 使用母版页可以方便的创建一组公共控件和代码, 并将其应用于网站中所有引用该母版页的网页. 可以通过控制母版页中占位符ContentPlaceHolder, 对网页进行布局; 由内容页和母版页组成的对象模型, 能够为应用程序提供一种高效, 易用的实现方式, 并且这种对象模型的执行效率比以前的处理方式有了很大的提高.

    1. 创建母版页:

    母版页是页面的公共部分, 因此, 在创建母版页时, 必须判断哪些内容是页面的公共部分.

    a)       网站的解决方案下, 右击网站名, 在弹出的快捷菜单中选择”添加新项”命令

     

    b)       选择母版页, 这样就创建了一个母版页

     

    2. 创建内容页

       还是右键单击网站名称, 在弹出的快捷菜单中选中 添加新项 , 在打开的 对话框中,      选择web窗体, 勾选将代码放在单独的文件中和选择母版页框, 单击添加按钮, 在下一个弹出的窗口中选择一个母版页, 然后单击确定

    3. 设置母版页应用范围:

    a)         ASP.NET中将内容页附加到母版页提供了3种级别(应用范围)

      i.页面级

    可以在每一个内容也中使用Page指令将内容页绑定到一个母版页, 代码如下:

    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" MasterPageFile="~/MasterPage.master"%>

    也可以通过编程方式, 动态应用母版页到某一个特定的内容页中: (手动敲入) override void

    <%@ Page Language="C#" %>
    <%@ MasterType TypeName="BaseMaster" %>
    <script runat="server">
        void Page_PreInit(Object sender, EventArgs e)
        {
            if (Request.QueryString["masterpage"] == "other")
            {
                this.MasterPageFile = "OtherMasterPage.master";
            }
    
            else
            {
                this.MasterPageFile = " MasterPage.master";
            }
            this.Title = Master.TitleName;
        }
    </script>
    
    <asp:content id="Content1" contentplaceholderid="ContentPlaceHolder1" runat="server">
         <p>&nbsp;</p>
            <h1 align=center>
                动态加载母版页
            </h1>
         <p>&nbsp;</p><p>&nbsp;</p>    
    </asp:content>

      ii.应用程序级:

    通过再应用程序的配置文件Web.config的pages元素中进行设置, 可以指定应用程中的所有ASP.Net页面(aspx文件)都自动绑定一个母版页, web.config文件中做如下设置:

      <system.web>
        <pages masterPageFile="MasterPage.master" />
      </system.web>

      iii.文件夹级

    这种方式和应用程序级的绑定类似, 不同的是只需要在一个文件夹中的一个Web.config文件中进行配置, 然后母版页绑定会应用于该文件夹中所有ASP.NET页, 而不会影响文件夹以外的页面.

    4. 母版页的事件顺序:对于控件而言, 事件都是在本地处理的, 即内容页的控件在内容页中引发事件, 母版页中的空间在母版页中引发事件, 控件事件不会从内容页发送到母版页, 也不能在内容页中处理来自母版页控件的事件.在某些情况下, 内容页母版页会引发相同的事件, 两者都引发Init和Load事件, 引发事件的一般规则是初始化事件从最里面的控件向最外面的控件引发, 而所有其他事件则从最外面的控件向最里面的控件引发.

    内容页的 Page_PreInit
    母版页的 Page_Init
    内容页的 Page_Init
    内容页的 Page_InitComplete
    内容页的 Page_PreLoad
    内容页的 Page_Load
    母版页的 Page_Load
    母版页或内容页的 按钮点击等回发事件(Master或Content的Button事件不会同时触发)
    内容页的 Page_LoadComplete
    内容页的 Page_PreRender
    母版页的 Page_PreRender
    内容页的 Page_PreRenderComplete
    内容页的 Page_SaveStateComplete
    母版页的 Page_Unload
    内容页的 Page_Unload

     

    在内容页中访问母版页中的控件:

    母版页前端代码:

    <%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
    
    <!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>
        <asp:ContentPlaceHolder id="head" runat="server">
        </asp:ContentPlaceHolder>
    </head>
    <body>
        <form id="form1" runat="server">
        <span style="font-family: 微软雅黑; font-size: small; font-weight: bold">访问母版页中的成员控件</span><br />
        <asp:ListBox ID="ListBox1" runat="server" Width="150px">
            <asp:ListItem Value="red">红色                </asp:ListItem>
            <asp:ListItem Value="blue">蓝色</asp:ListItem>
            <asp:ListItem Value="green">绿色</asp:ListItem>
            <asp:ListItem Value="yellow">黄色</asp:ListItem>
            <asp:ListItem Value="purple">紫色</asp:ListItem>
        </asp:ListBox>
        <div>
            <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
            
            </asp:ContentPlaceHolder>
        </div>
    </b></form>
    </body>
    </html>

    内容页default.aspx代码:

    <%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="无标题页" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
        以下是内容页的控件<br />
        <asp:DropDownList ID="DropDownList1" runat="server">
        </asp:DropDownList>
    </asp:Content>

    内容页default.aspx.cs代码:

     protected void Page_LoadComplete(object sender, EventArgs e)
        {
            //在母版页中查询ID为ListBox1的ListBox控件
            //将查询的值通过内容页中DropDownList控件显示出来。
            //调用Master.FindControl
            ListBox lb = Master.FindControl("ListBox1") as ListBox;
            DropDownList1.Items.Clear();
            foreach (ListItem li in lb.Items)
            {
                DropDownList1.Items.Add(li);
            }
    
        }

     最终效果:

  • 相关阅读:
    测试驱动开发的意义何在
    Web自动化测试模式page object的小利器:gizmo
    在NANT使用Nunit2标签运行Nunit测试
    小试牛刀 Ruby on Rails
    敏捷回顾会议的思考
    ThoughtWorks技术校园行第二波 课程资料 CleanCode&DirtyCode
    从git merge 和 git rebase想到……
    Ruby中的深浅拷贝
    NUnit Extension小介绍
    如何写好的测试呢?
  • 原文地址:https://www.cnblogs.com/wxylog/p/6197395.html
Copyright © 2020-2023  润新知