zoukankan      html  css  js  c++  java
  • 以编程方式使用 ASP.NET 母版页

    可以使用母版页以编程方式执行许多公共任务,包括:

    • 访问在母版页上定义的成员(包括公共属性/方法或控件)。

    • 动态地将母版页附加到内容页。

    访问母版页上的成员

    为了提供对母版页成员的访问,Page 类公开了 Master 属性。若要从内容页访问特定
    母版页的成员,可以通过创建 @ MasterType 指令创建对此母版页的强类型引用。可
    使用该指令指向一个特定的母版页。当该内容页创建自己的 Master 属性时,属性的
    类型被设置为引用的母版页。

    例如,可能有一个名为 MasterPage.master 的母版页,该名称是类名 MasterPage_master。可用创建类似于以下内容的 @ Page@ MasterType 指令:

    <%@ Page  masterPageFile="~/MasterPage.master"%>

    <%@ MasterType  virtualPath="~/MasterPage.master"%>

    当使用 @ MasterType 指令时(如本示例中的指令),可以引用母版页上的成员,如下面的示例所示:

    CompanyName.Text = Master.CompanyName;

    该页的 Master 属性的类型已设置为 MasterPage_master

    获取母版页上的控件的值

    在运行时,母版页与内容页合并,因此内容页的代码可以访问母版页上的控件。(如果母版页的 ContentPlaceHolder 控件中包含一些控件,则这些控件被内容页的 Content 控件重写后将不可访问。)这些控件是受保护的,因此不能作为母版页成员直接访问。但是,可以使用 FindControl 方法定位母版页上的特定控件。如果要访问的控件位于母版页的 ContentPlaceHolder 控件内部,必须首先获取对 ContentPlaceHolder 控件的引用,然后调用其 FindControl 方法获取对该控件的引用。

    下面的示例演示如何获取对母版页上的控件的引用。其中一个被引用的控件位于 ContentPlaceHolder 控件中,另一个则不是。

     
    // Gets a reference to a TextBox control inside a ContentPlaceHolder 
    ContentPlaceHolder mpContentPlaceHolder; 
    TextBox mpTextBox; 
    mpContentPlaceHolder = (ContentPlaceHolder)Master.FindControl(
    "ContentPlaceHolder1"); 
    if(mpContentPlaceHolder != null) 
    { 
       mpTextBox = (TextBox) mpContentPlaceHolder.FindControl("TextBox1");
       if(mpTextBox != null) { mpTextBox.Text = "TextBox found!"; } 
    } 
    // Gets a reference to a Label control that is not in a  
    // ContentPlaceHolder control 
    Label mpLabel = (Label) Master.FindControl("masterPageLabel"); 
    if(mpLabel != null) 
    { 
       Label1.Text = "Master page label = " + mpLabel.Text; 
    } 

    如上所示,可以使用 FindControl 方法访问母版页 ContentPlaceHolder 控件的内容。如果 ContentPlaceHolder 控件已与 Content 控件的内容合并,ContentPlaceHolder 控件将不会包含自己的默认内容。相反,它将包含在内容页中定义的文本和控件。

    动态地附加母版页

    除了以声明方式指定母版页(在 @ Page 指令或配置文件中)外,还可以动态地将母版页附加到内容页。因为母版页和内容页会在页处理的初始化阶段合并,所以必须在此前分配母版页。通常,在 PreInit 阶段动态地分配母版页,如下面的示例所示:

    void Page_PreInit(Object sender, EventArgs e)
    {    this.MasterPageFile = "~/NewMaster.master";
    }

    动态母版页的强类型

    如果内容页使用 @ MasterType 指令将一个强类型赋给了母版页,该类型必须适用于动态分配的所有母版页。如果要动态地选择一个母版页,建议您创建一个基类,并从此基类派生母版页。此基母版页类随后可以定义母版页共有的属性和方法。在内容页中,当使用 @ MasterType 指令将一个强类型赋给母版页时,可以将类型赋给该基类而不是单个母版页。

    下面的示例演示如何创建可以由多个母版页使用的基母版页类型。本示例包括一个从 MasterPage 控件派生的基类型、两个从该基类型继承的母版页和一个允许用户使用查询字符串 (?color=green) 动态选择母版页的内容页。此基主控类型定义了名为 MyTitle 的属性。其中一个母版页重写此 MyTitle 属性,另一个母版页没有重写。内容页将 MyTitle 属性作为页标题显示。因此,页标题将因所选择的母版页而异。

    这是基母版页类型。

    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 class BaseMaster : System.Web.UI.MasterPage
    {
        public virtual String MyTitle
        {
            get { return "BaseMaster Title"; }
        }
    }

    这是第一个母版页,它显示蓝色背景。注意,@ Master 指令中的 Inherits 属性引用基类型。

     
    <%@ Master Language="C#" Inherits="BaseMaster" ClassName="MasterBlue" %> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"  "http://www.w3.org/TR/
    xhtml11/DTD/xhtml11.dtd">
     <script runat="server"> 
    // No property here that overrrides the MyTitle property of the base 
    master.
    </script> 
    <html > 
    <head id="Head1" runat="server"> 
    <title>No title</title> 
    </head> 
    <body> 
    <form id="form1" runat="server"> 
    <div style="background-color:LightBlue"> 
       <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> 
          Content from MasterBlue. 
       </asp:contentplaceholder> 
    </div>
    </form> 
    </body> 
    </html> 

    这是第二个母版页。除了显示绿色背景以及重写了基类型中定义的 MyTitle 属性外,它与第一个母版页相同。

     
    <%@ Master Language="C#" Inherits="BaseMaster"
        ClassName="MasterGreen" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
        "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

    <script runat="server">
        public override String MyTitle
        {
            get { return "MasterGreen Title"; }
        }
    </script>

    <html  >
    <head id="Head1" runat="server">  
        <title>No title</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div style="background-color:LightGreen">
            <asp:contentplaceholder id="ContentPlaceHolder1"
                runat="server">
                Content from MasterGreen.
            </asp:contentplaceholder>
        </div>
        </form>
    </body>
    </html>

    这是内容页,它允许用户基于由请求提供的查询字符串来选择母版页。使用
    @ MasterType 指令将强类型赋给母版页的Master 属性时,该指令引用基类型。

     
    <%@ Page Language="C#" Title="Content Page" %>
    <%@ MasterType TypeName="BaseMaster" %>
    <script runat="server">
        protected void Page_PreInit(Object sender, EventArgs e)
        {
            this.MasterPageFile = "MasterBlue.master";
            if(Request.QueryString["color"] == "green")
            {
                this.MasterPageFile = "MasterGreen.master";
            }
            this.Title = Master.MyTitle;
        }
    </script>

    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1"
            Runat="Server">
        Content from Content page.
    </asp:Content>


     转载地址:http://blog.coders.com.cn/pignut_wang/
  • 相关阅读:
    windows的80端口被占用时的处理方法
    Ansible自动化运维工具安装与使用实例
    Tomcat的测试网页换成自己项目首页
    LeetCode 219. Contains Duplicate II
    LeetCode Contest 177
    LeetCode 217. Contains Duplicate
    LeetCode 216. Combination Sum III(DFS)
    LeetCode 215. Kth Largest Element in an Array(排序)
    Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)
    Contest 176
  • 原文地址:https://www.cnblogs.com/yiki/p/607135.html
Copyright © 2011-2022 走看看