母版页(扩展名是.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";
}
如何在内容页中修改关联母版页的内容
方法一是通过内容页前台设置的Page指令的Title属性,
<%@ Page Title="前台设置内容页标题" Language="C#" AutoEventWireup="true" ……%>
方法二是通过内容页后台设置Page.Header.Title 的值,
Page.Header.Title = "编程改变内容页标题";
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>
通过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>
<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