webabcd - 专注于asp.net, Silverlight

ASP.NET
从现在开始 一切都不晚
posts - 205, comments - 5700, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
[索引页]
[源码下载]



温故知新ASP.NET 2.0(C#)(1) - MasterPage(母版页)


作者:webabcd


介绍
母版页(MasterPage)就相当于模板页,挺简单的,没什么好说的。基于母版页的常用的功能有:母版页和内容页之间信息的传递,在内容页中用FindControl方法找到内容页中的控件等。另外,母版页是可以嵌套的。


关键
在内容页的头部加上母版页的强类型引用
<%--创建对母版页的强类型引用,并指定到母版页的虚拟路径--%>
<%@ MasterType VirtualPath="~/MasterPage/MasterPage.master" %>

1、内容页传递数据到母版页 - 母版页创建一个公共方法,然后内容页通过“Master.方法”来调用这个公共方法

2、母版页传递数据到内容页 - 母版页创建一个公共事件来传递数据,然后内容页处理这个事件

3、内容页中用FindControl方法找到内容页中的控件 - 用“Master.FindControl("ContentPlaceHolder1").FindControl("你要查找的控件ID")”来查找

4、嵌套母版页 - 说起来麻烦,看源码吧


示例
主母板页
Site.master
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="Site" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    
<title>重新过一遍ASP.NET 2.0(C#)</title>
</head>
<body>
    
<form id="form1" runat="server">
        
<div>
            
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
            
</asp:ContentPlaceHolder>
        
</div>
    
</form>
</body>
</html>

次母板页
MasterPage/MasterPage.master
<%@ Master Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeFile
="MasterPage.master.cs" Inherits="MasterPage_MasterPage" 
%>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    
<p>
        我是一个嵌套母版页
    
</p>
    
<p>
        母版页中的内容
        
<asp:DropDownList ID="ddlMaster" runat="server" DataSourceID="XmlDataSource1" DataTextField="text"
            DataValueField
="value" AutoPostBack="True" OnSelectedIndexChanged="ddlMaster_SelectedIndexChanged">
        
</asp:DropDownList><asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/Config/DropDownListData.xml">
        
</asp:XmlDataSource>
    
</p>
    
<p>
        内容页中的内容
        
<asp:ContentPlaceHolder ID="cph" runat="Server" />
    
</p>
</asp:Content>

MasterPage/MasterPage.master.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_MasterPage : System.Web.UI.MasterPage
{
    
protected void Page_Load(object sender, EventArgs e)
    
{

    }


    
/// <summary>
    
/// 设置ddlMaster的选中索引
    
/// 这个方法由内容页调用
    
/// </summary>
    
/// <param name="index"></param>

    public void SetddlMaster(int index)
    
{
        ddlMaster.SelectedIndex 
= index;
    }


    
protected void ddlMaster_SelectedIndexChanged(object sender, EventArgs e)
    
{
        
// ddlMaster的选中索引改变后,激发SelectedIndexChanged_ddlMaster事件
        SelectedIndexChanged_ddlMaster(thisnew CommandEventArgs(ddlMaster.SelectedItem.Text, ddlMaster.SelectedValue));
    }


    
// 声明一个公共时间事件,让内容页用
    public event CommandEventHandler SelectedIndexChanged_ddlMaster;
}


内容页
MasterPage/Test.aspx
<%@ Page Language="C#" MasterPageFile="~/MasterPage/MasterPage.master" AutoEventWireup="true"
    CodeFile
="Test.aspx.cs" Inherits="MasterPage_Test" Title="MasterPage测试" 
%>

<%--创建对母版页的强类型引用,并指定到母版页的虚拟路径--%>
<%@ MasterType VirtualPath="~/MasterPage/MasterPage.master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="cph" runat="Server">
    
<asp:dropdownlist id="ddlPage" runat="server" datasourceid="XmlDataSource1" datatextfield="text"
        datavaluefield
="value" autopostback="True" onselectedindexchanged="ddlPage_SelectedIndexChanged">
    
</asp:dropdownlist>
    
<asp:xmldatasource id="XmlDataSource1" runat="server" datafile="~/Config/DropDownListData.xml">
    
</asp:xmldatasource>
</asp:Content>

MasterPage/Test.aspx.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_Test : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
// 在内容页用FindControl方法找到内容页中的控件
        DropDownList ddl = new DropDownList();
        ddl 
= Master.Master.FindControl("ContentPlaceHolder1").FindControl("cph").FindControl("ddlPage"as DropDownList;
        Master.Master.FindControl(
"ContentPlaceHolder1").FindControl("cph").Controls.Add(new LiteralControl("<br />内容页中的DropDownList的ClientID是:" + ddl.ClientID));

        
// 增加一个事件处理,该事件是在母版页定义的一个公共事件
        Master.SelectedIndexChanged_ddlMaster += new CommandEventHandler(Master_SelectedIndexChanged_ddlMaster);
    }


    
void Master_SelectedIndexChanged_ddlMaster(object sender, CommandEventArgs e)
    
{
        
// CommandEventArgs已经在母版页中的公共事件“SelectedIndexChanged_ddlMaster”中指定
        string selectedText = e.CommandName;
        
string selectedValue = e.CommandArgument.ToString();

        ddlPage.SelectedValue 
= selectedValue;
    }


    
protected void ddlPage_SelectedIndexChanged(object sender, EventArgs e)
    
{
        
// 调用母版页的方法
        Master.SetddlMaster(ddlPage.SelectedIndex);
    }

}



OK
[源码下载]

Feedback

#1楼   回复  引用  查看    

2007-02-12 22:57 by 张振      
晕,都是代码,能不能多加点说明啊

#2楼[楼主]   回复  引用  查看    

2007-02-12 23:02 by webabcd      
@张振
不好意思,懒得写文字了,不过注释应该还是挺清楚的,你可以下载下来运行看看

#3楼   回复  引用    

2007-02-12 23:44 by ivw[未注册用户]
支持。

很少用模板,不知道跟html的框架有什么分别呢?

#4楼   回复  引用    

2007-02-13 08:47 by ivw[未注册用户]
请问楼主知不知道.net可不可以对多个客户机同时打印呢?

#5楼[楼主]   回复  引用  查看    

2007-02-13 11:58 by webabcd      
@ivw
用母板页送显后就是一个页
框架是多个页

“.net可不可以对多个客户机同时打印呢”不晓得阿

#6楼   回复  引用  查看    

2007-04-30 12:59 by 一切随风      
请问如果CheckBoxList控件放置在内容也中的时候为什么没有办法获得所选中的checkboxlist的值啊?

#7楼[楼主]   回复  引用  查看    

2007-04-30 14:07 by webabcd      
@一切随风
可以的
你可以下载文中提供的源码来看看,里面有实现母板页中控件和内容页中控件之间互相访问的例子

#8楼   回复  引用    

2007-07-16 16:14 by 奶茶[未注册用户]
谢谢,转拉

#9楼[楼主]   回复  引用  查看    

2007-07-16 18:08 by webabcd      
@奶茶
:)
不谢,随便转啦

#10楼   回复  引用  查看    

2007-10-12 16:44 by 一瞬间      
登陆不进去,数据库连接报错咯,请问要做怎么样的修改设置?

#11楼[楼主]   回复  引用  查看    

2007-10-12 18:44 by webabcd      
@一瞬间
我提供的demo程序的数据库使用的时sqlexpress,请确保启用了该服务,并且链接字符串中指定数据库服务与你的相关的sqlexpress实例名一样

如果还有问题,请把详细的错误信息贴出,然后再找原因

#12楼   回复  引用    

2007-11-24 13:01 by LJLee[未注册用户]
不错的源码。。

#13楼   回复  引用    

2007-11-24 13:11 by LJLee[未注册用户]
设计视力不支持创建和编辑嵌套的母版页。。怎么办??

#14楼   回复  引用  查看    

2007-11-24 15:07 by JoyBin      
请问。你那个锁定用户登陆是怎么弄的?

#15楼[楼主]   回复  引用  查看    

2007-11-25 09:10 by webabcd      
@LJLee
:)
vs2005的设计视图是不支持的,vs2008支持

@JoyBin
那个是Membership提供的功能

#16楼   回复  引用    

2007-12-18 14:37 by ryou[未注册用户]
用户名说是aaa了那么密码是什么

#17楼[楼主]   回复  引用  查看    

2007-12-18 15:07 by webabcd      
@ryou
用户名和密码都是abc
在登录页有提示的

aaa用户被锁定了,无法登录,其用于演示HealthMonitoring之用

#18楼   回复  引用    

2008-02-20 16:07 by 王想全T[未注册用户]
我用abc登录后,提示错误。我的数据库的实例名是SQLEXPRESS.
<hr/>
Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance. The connection will be closed.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance. The connection will be closed.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

#19楼[楼主]   回复  引用  查看    

2008-02-20 16:29 by webabcd      
@王想全T
确保SQLEXPRESS的服务正常运行
并且web.config中

下的连接字符串配置正确就好

#20楼   回复  引用  查看    

2008-02-20 16:42 by 王想全      
< add name="SqlConnectionString" connectionString="Data Source=ISS-WANGXQ\SQLEXPRESS;AttachDbFilename=|DataDirectory|\VS2005_Test.mdf;Integrated Security=True;User Instance=True";providerName="System.Data.SqlClient"/>

经过反复的试验,链接字符串中如果修改User Instance=False或者删除User Instance=True则可以登录上去,否则提示错误。请问这是为什么?

#21楼[楼主]   回复  引用  查看    

2008-02-20 20:23 by webabcd      
@王想全
这里有详细介绍
http://msdn2.microsoft.com/zh-cn/library/ms228037.aspx" target="_new">http://msdn2.microsoft.com/zh-cn/library/ms228037.aspx

#22楼   回复  引用  查看    

2008-02-21 09:46 by 王想全      
< %--创建对母版页的强类型引用,并指定到母版页的虚拟路径--% >
< %@ MasterType VirtualPath="~/MasterPage/MasterPage.master" % >

这条语句是否只适用于内容页上,并且该内容页的母版页是嵌套母版页?

#23楼[楼主]   回复  引用  查看    

2008-02-21 12:13 by webabcd      
@王想全
在母版页或内容页上都可以
指定当前页所属的母版页路径就好

#24楼   回复  引用  查看    

2008-02-21 16:53 by 王想全      
我试了,得出一个结论:
如果内容页用的是嵌套的母版页,则必需得加上< %@ MasterType VirtualPath="~/MasterPage/MasterPage.master" % >,否则可用可不用该语句。???

#25楼[楼主]   回复  引用  查看    

2008-02-21 17:47 by webabcd      
@王想全
它就是对母版页的强类型引用
你想引用哪个母版页就指定其路径就好,与是否是嵌套的母版页没关系

#26楼   回复  引用  查看    

2008-04-19 10:11 by Sam Lin      
请教一下Lz
一、用MasterPage会影响程序的性能吗?因为使用了MasterPage的时候,所以有控件Name、ID的属性都的前缀都会加上"ctl00$ContentPlaceHolder1$"和"ctl00_ContentPlaceHolder1_",如果当页面的元素很多的时候会令页面增加了不少的字节,而且ViewState也占了不少。
二、如果用了MasterPage,用JavaScript怎么判断内容页中的页面元素?是通过脚本定义一个前缀还是在C#中定义来进行判断?
比如:var prefix = "ctl00_ContentPlaceHolder1_";
var obj = document.getElementById(prefix + someElementID);
或者:
在C#中得对控件的ClientID来返回呢?
三、我的想法是如果需要用到Master,用framset或都iframe代替,不知是否可行。
四、你们一般会用TreeView吗?
谢谢

#27楼[楼主]   回复  引用  查看    

2008-04-21 08:09 by webabcd      
@Sam Lin
1、程序性能上影响不大,就是多占些带宽
“ContentPlaceHolder1”是ContentPlaceHolder的ID,可以把它设简单一些

2、用<%=Control.ClientID%>

3、当然可以

4、会,功能树,权限树,有父子关系的一般都会用

#28楼   回复  引用    

2008-07-02 16:09 by jie2004[未注册用户]
现有一母版页,左边有一棵树,不同节点链接到不同的内容页,如果实现点击链接时只刷新内容页,不刷新母版页?

#29楼[楼主]   回复  引用  查看    

2008-07-03 12:08 by webabcd      
@jie2004
实现这个需求就用框架好了,母版页不合适



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 648812




相关文章:

相关链接: