asp.net母版页学习总结

Asp.Net母版页的使用

http://www.cnblogs.com/xqhppt/archive/2010/10/10/1847348.html


背景:回顾下以前用到过的asp.net控件


介绍:


  使用 ASP.NET 母版页可以为应用程序中的页创建一致的布局。单个母版页可以为应用程序中的所有页(或一组页)定义所需的外观和标准行为。然后可以创建包含要显示的内容的各个内容页。当用户请求内容页时,这些内容页与母版页合并以将母版页的布局与内容页的内容组合在一起输出。


  母版页为具有扩展名 .master的asp.net文件。


原理:


  母版页主要是由母版页本身(.master文件)和一个或多个内容页组成。


  母版页包括一个或多个 控件,在内容页中可以定义要替换的内容。


  容页中通过添加 Content 控件并将这些控件映射到母版页上的 ContentPlaceHolder控件来创建内容。


示例代码:
代码


<%@ Page Title="" Language="C#" MasterPageFile="~/TestMain.Master" AutoEventWireup="true" CodeBehind="AnotherTestPage.aspx.cs" Inherits="Maticsoft.Web.AnotherTestPage" %>



   

       

           


                这里是另一个内容页(AnotherTestPage.aspx)
           


           


                        Master Page 使您有能力为 web 应用程序中的所有页面(或页面组)创建一致的外观和行为。
                Master Page 为其他页面提供了模版,带有共享的布局和功能。Master Page 为内容定义了可被内容页面覆盖的占位符。而输出结果就是 Master Page 和内容页面的组合。

                        内容页包含您希望显示的内容。
                当用户请求内容页时,ASP.NET 会对页面进行合并以生成输出,输出结果对 Master Page 的布局和内容页面的内容进行了合并。
           


       

   




母版页代码


<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="TestMain.master.cs" Inherits="Maticsoft.Web.TestMain" %>







   
    
   


   

   

       
       

           

               

左侧导航


               

                    asp.net

                    CSS

                    HTML

                    JQuery
               

           

           

               
               

           

       

   

   





========

ASP.NET中的母版页



何为母版页,顾名思义母版就是模版,就像在PPT里面的板式或主题一样,大框架已经有了,我们的任务就是向里面添加具体的内容。这样我们制作的所有幻灯片的外观大体都是一样的。


       在ASP.NET中母版页有两种作用,一是提高代码的复用(把相同的代码抽出来),二是使整个网站保持一致的风格和样式。
那在VS中怎样建立和使用母版页呢?下面我为大家具体讲来。
1、添加项-母版页


在新建的母版页中你会发现自动生成了两个ContentPlaceHolder控件


其中一个在head区, ID是“head”;另一个在body区,默认ID是“ContentPlaceHolder1”,可以根据需要自己命名。这是两个占位符控件,将来具体的代码就出现在这两个控件所限制的区域。


2向母版页中添加需要抽取出来的公共代码,并把两个ContentPlaceHolder控件放到需要添加具体内容的地方(一般head区的控件不用动,只需动body区的。)


3、然后就可以建立使用母版页的Web窗体了(以新建的母版页为母版)


在新建的web窗体中,你会发现同样有两个控件,这是两个Content控件(内容区域),在这两个控件之间写具体的代码。


Content控件有一个属性ContentPlaceHolderID,每个Content控件就是通过这个属性和母版页中的ContentPlaceHolder关联的


这两个控件一个和母版页head区的ContentPlaceHolder控件关联,一个和body区的关联,如下:


[html] 
 
 
     
     
   
 
 
 
   
 
   
 
         
         
       
 
   
 
   
 
 


[html] 
 
 
 
 
 


就这样,通过母版页中的ContentPlaceHolder控件和 使用母版页的 Web页中的Content控件的关联实现了普通Web页和母版页的关联。


那么母版页和普通Web页有什么区别呢?


1、母版页的开头是<%@ Master......%>,而普通Web页的开头是<%@ Page......%>


2、母版页不可以在浏览器中预览,而普通页可以。


3、使用母版页的Web页的title在开头设置<%@ Page...... title=“标题”%>,而普通页的标题在head区的标签中写 <br> <br> <br>         母版页是可以嵌套的,即在原母版页的基础上再建立母版页。这样不仅进一步提高了代码的复用,而且在使整个网站的外观一致的基础上,各个模块又有自己的子风格。比如一家公司的网站整体外观是类似的,而各个部门又有自己的子外观。 <br> <br> <br> 嵌套的母版页不会自动生成ContentPlaceHolder 控件,需要手动写入 <br> ======== <br> <h1>asp.net 母版页使用详解</h1>    <br> 母版页是VS2005中新引入的一个概念,它很好地实现界面设计的模块化,并且实现实现了代码的重用。它就像婚纱影楼中的婚纱模板,同一个婚纱模板可以给不同的新人用,只要把他们的照片贴在已有的婚纱模板就可以形成一张漂亮的婚纱照片,这样可以大大简化婚纱艺术照的设计复杂度。这里的母版页就像婚纱模板,而内容页面就像两位新人的照片。 <br> 在VS2003中没有母版页,要实现这种设计重用的效果,我们只能用“用户控件”来实现,但用户控件没有一种可视化的组合外观,使用起来不太方便。 <br> <br> <br> 母版页(扩展名是.master) <br> 它的使用跟普通的页面一样,可以可视化的设计,也可以编写后置代码。与普通页面不一样的是,它可以包含ContentPlaceHolder控件,ContentPlaceHolder控件就是可以显示内容页面的区域。 <br> 代码如下: <br> <%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %> <br> ...... <br>     <form id="form1" runat="server"> <br>     <div> <br>         <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> <br>         </asp:contentplaceholder> <br>     </div> <br>     </form> <br> ...... <br> <br> <br> 注意: <br>     1、这里的声明指示符是“<%@ Master...%>” <br>     2、其内部包含<asp:contentplaceholder......>控件 <br> <br> <br> 内容页(扩展名是.aspx) <br> 在建立内容页面的时候,在“添加新项”对话框中要选中“选择母版页”复选框。这样建立的页面就是内容页面,内容页面在显示的时候会把母版面的内容一起以水印淡化的形式显示出来,而在母版页中的ContentPlaceHolder控件区域会被内容页面中的Content控件替换,程序员可以在这里编写内容页面中的内容。 <br> 代码如下: <br> <%@ Page Language="C#" MasterPageFile="~/MasterPage/MP.master" AutoEventWireup="true" CodeFile="Show1.aspx.cs" Inherits="MasterPage_Show1" Title="Untitled Page" %> <br> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <br> </asp:Content> <br> <br> <br> 注意: <br>     1、这里的声明指示符中多了一项MasterPageFile="~/MasterPage/MP.master",这一项是在创建内容页面时根据“选择母版页”复选框的选中情况生成的。它指明了该页是内容页面,也指明了该内容页面的母版页是哪个页面。 <br>     2、“<asp:Content ......>”就是要在其中显示的内容。 <br> <br> <br> 一、在母版页中编写后台代码,访问母版页中的控件: <br>     与普通的aspx页面一样,双击按钮即可编写母版页中的代码 <br>      <br> 二、在内空页面中编写后台代码,访问内容页面中的控件: <br>     与普通的aspx页面一样,双击按钮即可编写母版页中的代码 <br>      <br> 三、在内容页面中编写代码访问母版页中的控件: <br>     在内容页面中有个Master对象,它是MasterPage类型,它代表当前内容页面的母版页。通过这个对象的FindControl方法,我们可以找到母版面中的控件,这样就可以在内容页面中操作母版页中的控件了。 <br>         TextBox txt = (TextBox)((MasterPage)Master).FindControl("txtMaster"); <br>         txt.Text = this.txtContent1.Text; ; <br>          <br> 四、在内容页面中编写代码访问母版页中的属性和方法: <br>     仍可能通过Master对象进行访问,只不过在这里要把Master对象转换成具体的母版页类型,然后再调用母版页中的属性和方不法。 <br>     这里要说明的是:母版页中要被内容页面调用的属性和方法必须是Public修改的。否则无法调到。 <br>         假设母版页中有下面的属性和方法: <br>         public string TextValue <br>         { <br>             get <br>             { <br>                 return this.txtMaster.Text; <br>             } <br>             set <br>             { <br>                 this.txtMaster.Text = value; <br>             } <br>         } <br>         public void show(string str) <br>         { <br>             txtMaster.Text = str; <br>         }  <br>        在内容页面中可以通过下代的代码来实现对母版页中方法的调用:  <br>         ((MasterPage_MP)Master).show(this.txtContent1.Text); <br>         ((MasterPage_MP)Master).TextValue = this.txtContent1.Text; <br>          <br> 五、在母版页中访问内容页面的控件: <br>     在母版页中可以通过在ContentPlaceHolder控件中调用FindControl方法来取得控件,然后对控件进行操作。 <br>     ((TextBox)this.ContentPlaceHolder1.FindControl("txtContent1")).Text = this.txtMaster.Text; <br>      <br> 六、在母版页中访问内容页面中的方法和属性: <br>     在母版页中调用子页面中的属性和方法有点难度,因为我们无法像上一步中那样通过FindControl来找到方法和属性。 <br>     于是我们想到在母版面的声明指示符中加入下面的代码: <br>         <%@ Reference Page="~/MasterPage/Show1.aspx" %> <br>     在运行的时候回发现有错误,错误的内容是“无法实现循环引用”。这是因为默认在子页面中引用了母版页,你也就不能再在母版页中引用子页面了。 <br>     我在网上也没找到更好的解决方法,但这使我们想起C#是的“反射”,它可以使我们动态获取页面对象,并且可以调用它的属性和方法。 <br>     代码如下: <br>         Type t = this.ContentPlaceHolder1.Page.GetType(); <br>         PropertyInfo pi = t.GetProperty("ContentValue"); //获取ContentValue属性 <br>         pi.SetValue(this.ContentPlaceHolder1.Page,this.txtMaster.Text,null);    //给属性赋值 <br>          <br>         MethodInfo mi = t.GetMethod("SetValue"); //获取SetValue()方法 <br>         object[] os = new object[1];   //建造输入参数 <br>         os[0] = txtMaster.Text; <br>         mi.Invoke(this.ContentPlaceHolder1.Page, os);    //调用SetValue方法 <br>          <br> 七、在有多个内容页面使用母版面的情况下,在母版页中根据不同的内容页面实现不同的操作 <br>     在母版页中可以加入多个不同的内容页面,但在设计期间,我们无法知道当前运行的是哪个内容页面。所以只能通过分支判断当前运行的是哪个子页面,来执行不同的操作。这里也用到了反射的知识。 <br>     代码如下: <br>         string s = this.ContentPlaceHolder1.Page.GetType().ToString();   //取出内容页面的类型名称 <br>         if (s == "ASP.default17_aspx")   //根据不同的内容页面类型执行不同的操作 <br>         { <br>             ((TextBox)this.ContentPlaceHolder1.FindControl("TextBox2")).Text = "MastPage"; <br>         } <br>         else if (s == "ASP.default18_aspx") <br>         { <br>             ((TextBox)this.ContentPlaceHolder1.FindControl("TextBox2")).Text = "Hello MastPage"; <br>         } <br> 八、在母版面与内容页面中JS代码的操作 <br>     在母版页或内容页面中的控件运行之后会自动生成ID,如文本框的ID是txtContent1,在运行之后ID会自动变为ctl00_ContentPlaceHolder2_txtContent1,name属性会变为ctl00$ContentPlaceHolder2$txtContent1。 <br>     在JS代码中,我们用document.getElementById()方法,根据id取得控件对象的时候,应当使用ctl00_ContentPlaceHolder2_txtContent1这个ID名,否则会产生“未找到对象”的异常。 <br>    (车延禄) <br> 母版页运行机制 <br> 母版页仅仅是一个页面模板,单独的母版页是不能被用户所访问的。单独的内容页也不能够使用。母版页和内容页有着严格对应关系。母版页中包含多少个ContentPlaceHolder控件,那么内容页中也必须设置与其相对应的Content控件。当客户端浏览器向服务器发出请求,要求浏览某个内容页面时,ASP.NET引擎将同时执行内容页和母版页的代码,并将最终结果发送给客户端浏览器。 <br> 母版页和内容页的运行过程可以概括为以下5个步骤。 <br> (1)用户通过键入内容页的URL来请求某页。 <br> (2)获取内容页后,读取@ Page指令。如果该指令引用一个母版页,则也读取该母版页。如果是第一次请求这两个页,则两个页都要进行编译。 <br> (3)母版页合并到内容页的控件树中。 <br> (4)各个Content控件的内容合并到母版页中相应的ContentPlaceHolder控件中。 <br> (5)呈现得到结果页。 <br> <br> <br> 母版页和内容页事件顺序 <br> <br> <br> (1)母版页中控件Init事件; <br> (2)内容页中Content控件Init事件; <br> (3)母版页Init事件; <br> (4)内容页Init事件; <br> (5)内容页Load事件; <br> (6)母版页Load事件; <br> (7)内容页中Content控件Load事件; <br> (8)内容页PreRender事件; <br> (9)母版页PreRender事件; <br> (10)母版页控件PreRender事件。 <br> (11)内容页中Content控件PreRender事件。 <br> <br> <br> 使用母版页的优点: <br> (1)有利于站点修改和维护,降低开发人员的工作强度 <br> (2)有利于实现页面布局 <br> (3)提供一种便于利用的对象模型 <br> ======== <br> <h1>asp.net母版页的使用</h1> <br> <br> 工具/原料 <br> Visual Studio 2008 <br> 方法/步骤 <br> 1 <br> 打开Visual Studio 2008,点击【文件】【打开网站】找到网站根目录文件夹,点击【打开】 <br> 2 <br> 在网站根目录上单击右键,选择【添加新项】 <br> 计算机专业毕业设计:[14]asp.net母版页的使用 <br> 3 <br> 在弹出的【添加新项】选择【母版页】默认使用名称,点击【添加】 <br> 4 <br> 打开母版页的拆分界面,我们可以看见页面视图里面有一个【ContentPlaceHolder】元素 <br> 5 <br> 网页元素【ContentPlaceHolder】里面放置的是子页面的东西,我们每个页面不同的地方就使用这个,所以先复制网页元素到母版页 <br> 6 <br> 母版页代码【 <br>         <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">        子页面内容                </asp:ContentPlaceHolder>】用于显示不同页面差异部分 <br> 7 <br> 注意,母版页必须存放于网站根目录,以便随时调用 <br> ======== <br> <h1>ASP.NET 访问母版页元素总结</h1> http://blog.csdn.net/nieweiking/article/details/9203467 <br>   <br>   第一种方法: <br> <br> <br>   在母版页里面新建一个Label控件 <br> <br> <br>   <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server"> <br> <br> <br>   </asp:ContentPlaceHolder> <br> <br> <br>   <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> <br> <br> <br>   在内容页里面我们可以使用以下代码访问: <br> <br> <br>   Label lbl =(Label)Master.FindControl("Label1"); <br> <br> <br>   lbl.Text = "first"; <br> <br> <br>   第二种方法: <br> <br> <br>   我们可以在母版页的后台代码类中添加自定义属性 <br> <br> <br>   public string LabelText <br> <br> <br>   { <br> <br> <br>   get{return this.Label1.Text;} <br> <br> <br>   set{this.Label1.Text = value;} <br> <br> <br>   } <br> <br> <br>   然后在内容页里面添加如下代码: <br> <br> <br>   <%@ MasterType VirtualPath="~/MasterPage.master" %> <br> <br> <br>   这样我们就可以直接在代码页中用如下属性访问了 <br> <br> <br>   Master.LabelText = "second"; <br> <br> <br>   不管是第一种还是第二种方法 <br> <br> <br>   如果将母版页代码改成如下: <br> <br> <br>   <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server"> <br> <br> <br>   <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> <br> <br> <br>   </asp:ContentPlaceHolder> <br> <br> <br>   就会报如下运行时错误 <br> <br> <br>   未将对象引用设置到对象的实例。 <br> ======== <br> <h1>博客系统母版页</h1> <br> <p>master文件;</p> <p></p> <pre><code class="language-csharp"><%@ 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>无标题页
  欢迎您, 。  注册        开通博客     找回密码 找回密码



版权所有©2007 www.DrASP.NET
MSN群、邮箱:[email protected]

cs文件;

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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 MasterPage : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //判断用户是否已经开通了博客
        if (UsersBLL.CurrentUserHasRegistedBlog())
        {
            //如果已经开通,则显示“我的博客”,并将链接指向当前用户的博客主页
            blogLink.Text = "我的博客";

            string currentUserId = UsersBLL.GetCurrentUserID().ToString();//.GetCurrentUserName();//
            blogLink.NavigateUrl = @"~/blog/Default.aspx?userId=" + currentUserId;
        }
        else
        {
            //如果没有开通,则显示“开通博客”,并将链接指向开通博客页面
            blogLink.Text = "开通博客";

            blogLink.NavigateUrl = "~/Blog/RegBlog/RegBlog.aspx";

        }
    }
}

========

政府网站母版页

master文件;

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="site.master.cs" Inherits="site" %>





    政府网站



    
ASP.NET 网站开发从入门到精通 |  |  
   
ASP.NET  网站开发从入门到精通
政府网站

cs文件;

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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 site : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void LoginStatusControl_LoggingOut(object sender, LoginCancelEventArgs e)
    {

    }
}
========

论坛母版页

master文件;

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="master.master.cs" Inherits="master" %>





    My bbs
    


    

cs文件;

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;
using System.Data.SqlClient;

public partial class master : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
                
        SqlConnection conn = new SqlConnection("server=localhost;database=bbs;user id=sa;password=sa");
        if (Session["userid"] != null && Session["username"] != null)
        {
            username.Text = Session["username"].ToString();
            lastlogin.Text = Session["lastlogin"].ToString();
            string strsql = "select * from class,banzhu where class.id = banzhu.classid and userid='" + 
                Session["userid"].ToString() + "'";
            SqlCommand myComm = new SqlCommand(strsql, conn);
            conn.Open();
            SqlDataReader myReader = myComm.ExecuteReader();
            if (myReader.HasRows)
            {
                status.Text = "担任的社区版主";
                string strStatus = "
    \n"; int i=1; while (myReader.Read()) { string classname = myReader["classname"].ToString(); System.IO.StringWriter urlClass = new System.IO.StringWriter(); Server.UrlEncode(classname, urlClass); strStatus += "
  • " + classname + "
  • "; string banzhu = "banzhu" + i; Session[banzhu] = classname; i++; } strStatus += "
"; Session["banzhu"] = i.ToString(); shenfen.InnerHtml = strStatus; } else { status.Text= "您是普通会员!"; } myReader.Close(); strsql = "select * from [user] where userid ='" + Session["userid"].ToString() + "'"; myComm.CommandText = strsql; myReader = myComm.ExecuteReader(); myReader.Read(); blognum.Text = myReader["blognum"].ToString(); myReader.Close(); conn.Close(); myArticle.NavigateUrl = "article.aspx?my=" + Session["userid"].ToString(); addArticle.NavigateUrl = "articleEdit.aspx?action=add"; } string sql = "select * from class"; SqlCommand Comm = new SqlCommand(sql, conn); conn.Open(); SqlDataReader Reader = Comm.ExecuteReader(); if (Reader.HasRows) { string str = "
    \n"; while (Reader.Read()) { string classname = Reader["classname"].ToString(); System.IO.StringWriter urlname = new System.IO.StringWriter(); Server.UrlEncode(classname, urlname); str += "
  • " + classname + "
  • \n"; } str += "
"; online.InnerHtml = str; Reader.Close(); } else { online.InnerHtml = "没有论坛分区"; } conn.Close(); } }



你可能感兴趣的:(转载,.Net,asp.net,母版页)