asp.net 母版页

母版页(扩展名是.master)

<%@ 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">
    <div>
        <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
        
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

其中ContentPlaceHolder控件就是可以显示内容页面的区域,母版页使用和设计编写和普通aspx页面类似.一样可以在MasterPage.master.cs编写后台代码

在PreInit事件中动态加载母版页,
 protected void Page_PreInit(object sender, EventArgs e)
{
    MasterPageFile = "~/MasterPage.master"; 
}

如何在内容页中修改关联母版页的内容
很多时候多个内容页加载同一个母版页,为了使各个内容页中加载的同一个母版页内容有所不同,我们需要修改合并在内容页中的母版页内容。
1、修改Title标签属性
当母版页的head标签包含Runat=”Server”属性时,可以修改内容页的title标签属性,使其不显示母版页的默认title,
方法一是通过内容页前台设置的Page指令的Title属性,
<%@ Page  Title="前台设置内容页标题" Language="C#" AutoEventWireup="true" ……%>
方法二是通过内容页后台设置Page.Header.Title 的值,
Page.Header.Title = "编程改变内容页标题";
2、修改Head标签属性
当母版页的head标签包含Runat=”Server”属性时,我们可以通过后台代码修改head标签包含的标签属性,并可以为head标签动态添加指定的标签,如“meta”标签;代码中Page.header返回的是HtmlHead对象,代表head标签,HtmlMeta对象代表Meta标签。
using System.Web.UI.HtmlControls;
……
……
protected void Page_Load(object sender, EventArgs e)
{
    //修改head标签中的title标签属性
    Page.Header.Title = "编程改变内容页标题";
    //修改head标签包含的其它标签属性,间接修改了页面背景颜色
    Style myStyle = new Style();
    myStyle.BackColor = System.Drawing.Color.Red;
    Page.Header.StyleSheet.CreateStyleRule(myStyle, null, "html");
    //添加新标签meta到head标签中
    HtmlMeta metaKeywords = new HtmlMeta();
    metaKeywords.Name = "KEYWORDS";
    metaKeywords.Content = "asp.net,c#";
    HtmlHead head = Page.Header;
    head.Controls.Add(metaKeywords);
}

ASP.NET Master Page改变内容页title方法
  在定义好母版页以后,有时我们需要改变网页的标题但是如果直接在母版页中更改title属性又会导致其他的内容页出现相同的title情况,VS2008中提供了母版页的新功能。 
  1.通过内容页中的Page指令中Title属性改变内容页title:
<%@ Page Language=”C#” MasterPageFile=”~/MyMaster.master” Title=”My Title” %>
  2.通过编程改变:前提是<head>标志必须是运行在服务器端,即要给它加上runat="server"属性
void Page_Load() { ...... Page.Header.Title="My Title"; ...... }
  3.通过内容页的head占位符控件,在VS2008中添加的母版页会在头部有如下按商品asp:ContentPlaceHolder控件(把母版页的title标签拖到该控件内)
<asp:ContentPlaceHolder id="head" runat="server"> <title>无标题页</title></asp:ContentPlaceHolder>
  而内容页往往会添加一个对应的asp:Content控件,只需要改变其中的title标签内容即可


<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> <title>无标题页</title> </asp:Content>
3、修改其它服务器控件属性
A、直接修改法:
通过ID查找母版页控件,((Label)Master.FindControl("Label1")).Text = "内容页";
B、间接修改法:
先在母版页中将需要修改的控件属性包装成公开属性,
public string BodyTitle
{
    get{return this.Label1.Text;}
    set{ this.Label1.Text = value;}
}
然后在内容页中转换母版页为特定的母版页类型,
<%@ MasterType VirtualPath="~/masterpage/MasterPage.master" %>
最后在内容页中调用母版页公开的属性,设置其值,Master.BodyTitle = "内容页";

内容页(扩展名是.aspx)

添加web窗体的时候,右下角会有一个选项选择母版页,选中以后选择要添加进去的母版页即可

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
</asp:Content>

MasterPageFile="~/MasterPage.master"就是母版页的位置.

<asp:Content Runat="Server">这里边就是显示的内容
</asp:Content>

web.config全局设置

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

局部设置:用这种方法可以局部文件或文件夹添加特定母版页

<configuration>
        <location path="otherfile">
            <system.web>
                <pages masterPageFile="~/MasterPage.master " />
            </system.web>
        </location>
    </configuration>
Location的path属性是设置的路径

内容页访问母版页中的控件,用Master.FindControl("母版页控件id")

在内容页取 masterpage中的属性和字段
     在内容页中取masterpage中的属性或字段应该是比较常用的。创建一个masterpage页MasterTest.master 和内容页Test.aspx,在MasterTest.master的后台代码中添加一个属性,如下
   private string m_Name;
    public string Name
    {
        get { return m_Name; }
        set { m_Name = value; }
    }
然后在内容页的后台代码中你会发现不能访问masterpage中的属性,这时切换到内容页的源里在上面添加 
<%@ MasterType VirtualPath="~/MasterTest.master" %>
再切换到后台中 就可以访问masterpage中的属性了。

内容页中调用css和javascript

第一种方法:使用<asp:ScriptManagerProxy>元素

<%-- 这种方法是利用了ScriptManagerProxy控件中Scripts来引用js --%>
<asp:ScriptManagerProxy ID="aa" runat="server">
    <Scripts> 
        <asp:ScriptReference Path="My97DatePicker/WdatePicker.js" />
    </Scripts>
</asp:ScriptManagerProxy>

 这里之所以要使用ScriptManagerProxy是因为使用母版页时候要保证ScriptManager元素只有唯一一个,具体的就不多说了,MSDN查一下就明白了。
 这种方法我个人觉得要稍微麻烦点(要敲多点代码),而且只能引用js,css无效。
第二种方法: 使用<asp:ContentPlaceHolder>元素
 
母版页中代码段:
<head runat="server">
    <title>TechMan</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="keywords" content="$页面关键字$" />
    <meta name="description" content="$页面描述$" />
    <asp:ContentPlaceHolder ID="cphHead" runat="server"></asp:ContentPlaceHolder>
</head>

 内容页中代码段:

<%-- 这种是利用ContentPlaceHolder的方法,这种方法更加自由,还可以自由引用css --%>
<asp:Content ID="con2" runat="server" ContentPlaceHolderID="cphHead">
    <script type="text/javascript" src="My97DatePicker/WdatePicker.js"></script>
    <link href="css/site.css" rel="stylesheet" type="text/css" />
</asp:Content>

这种方法简单实用,而且js和css都能很好的引用,利用这种做法可以很简单的解决很多类似问

后台动态加载(引用集System.Web.UI.HtmlControls.HtmlGenericControl)

#region 加载JS文件  
System.Web.UI.HtmlControls.HtmlGenericControl JSControl = new System.Web.UI.HtmlControls.HtmlGenericControl("script");  
JSControl.Attributes.Add("type", "text/javascript");  
JSControl.Attributes.Add("src", "JS/js.js");  
Page.Header.Controls.Add(JSControl);  
#endregion
引用集(System.Web.UI.HtmlControls.HtmlLink)
#region 加载CSS文件
System.Web.UI.HtmlControls.HtmlLink CssControl = new System.Web.UI.HtmlControls.HtmlLink();
CssControl.Href = "/CSS/Style.css";
CssControl.Attributes.Add("rel", "stylesheet");
CssControl.Attributes.Add("type", "text/css");
Page.Header.Controls.Add(CssControl);
#endregion


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值