var competitive=new {technique,business}

2007/5/14

MasterPage小议

在设计时masterpage和page是两个分离的对象,他们有各自的children而在运行时masterpage用自己的children替代page的children.在PreInit事件之后Init事件之前masterpage将Content控件内容移至ContentPlaceHolder内并进行排放,当Init事件发生后masterpage作为control加入page中。

替换masterpage的三种方法:

1,在preinit事件中设置MasterPageFile。

2,如果有多个页需要替换masterpage而又嫌麻烦可以写一个继承至page的类,为该类添加PreInit事件:

using System;
using System.Web.UI;
public class BasePage : Page
{
public BasePage()
{
this.PreInit += new EventHandler(BasePage_PreInit);
}
void BasePage_PreInit(object sender, EventArgs e)
{
MasterPageFile = "~/Master1.master";
}
}

3,使用HttpMoudule

using System;
using System.Web;
using System.Web.UI;
public class MasterPageModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
}
void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
Page page = HttpContext.Current.CurrentHandler as Page;
if (page != null)
{
page.PreInit +=new EventHandler(page_PreInit);
}
}
void page_PreInit(object sender, EventArgs e)
{
Page page = sender as Page;
if (page != null)
{
page.MasterPageFile = "~/Master1.master";
}
}
public void Dispose()
{
}
}

Content Page 到 MasterPage的交互

在masterpage中使用属性定义控件的值这样在content page中使用master.property更改masterpage中控件的值,而使用master.fincontrol方法需要类型转换且不进行编译时类型检查。

如果我们在一个程序中有两个masterpage将导致如下错误:Unable to cast object of type 'ASP.master2_master' to type 'ASP.master1_master'.解决方法是创建继承至masterpage的母版页。(我试验了一下没发现此问题??)

MasterPage到Content Page的交互

masterpage中的控件不知道content page中的内容所以应该使用事件。

定义一个cs文件:

using System;
public class SendEmailEventArgs : EventArgs
{
public SendEmailEventArgs(string toAddress)
{
_toAddress = toAddress;
}
private string _toAddress;
public string ToAddress
{
get { return _toAddress; }
set { _toAddress = value; }
}
}
public delegate void SendEmailEventHandler(
object sender, SendEmailEventArgs e);

MasterPage中:

<%@ Master Language="VB" %>
<script runat="server">
Public Event SendEmail As SendEmailEventHandler
Protected Sub SendEmailButton_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Dim eventArgs As New SendEmailEventArgs(EmailAddressBox.Text)
RaiseEvent SendEmail(Me, eventArgs)
End Sub
</script>

content page中:

<%@ Page Language="VB" MasterPageFile="~/Master1.master"
AutoEventWireup="true" %>
<%@ MasterType VirtualPath="~/Master1.master" %>
<script runat="server">
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
AddHandler Master.SendEmail, AddressOf EmailReport
End Sub
Protected Sub EmailReport(ByVal sender As Object, ByVal e As SendEmailEventArgs)
Dim address As String = e.ToAddress
' do work
End Sub
</script>

详见ASP.Net 2.0 - Master Pages: Tips, Tricks, and Traps

0 评论: