如何以编程方式设置母版页?

时间:2009-12-14 04:26:14

标签: asp.net master-pages

功能

private void SetUpMasterPage(){
    this.MasterPageFile = "~/MasterPages/NestedMasterPageTest2.Master"; 
}
在OnPreInit上调用

...当masterpagefile是基本母版页时,这是有效的...但是我们如何使其适用于嵌套母版页呢?

我们确实尝试了

this.Master.MasterPageFile = "~/MasterPages/Base.Master"; 

但它会引发异常...... =(


所以,为了让事情更清楚,在aspx上

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Test._Default"%>
<asp:Content ID="testContent" ContentPlaceHolderID="body" runat="server">
This is a test!
</asp:Content>

在base.Master上

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Base.master.cs" Inherits="Test.Base" %>
<!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>The title</title>
    <asp:ContentPlaceHolder ID="head" runat="server"></asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
    <div>
        <asp:ContentPlaceHolder ID="body" runat="server">
        </asp:ContentPlaceHolder>
    </div>
</form>
</body>
</html>

和default.aspx.cs

protected override void OnPreInit(EventArgs e){
    this.MasterPageFile = "~/MasterPages/Base.Master";
}

它正在运作......


但是当我使用nested master page

<%@ Master Language="C#" MasterPageFile="~/MasterPages/Base.Master" AutoEventWireup="true" CodeBehind="NestedMasterPageTest2.master.cs" Inherits="Test.MasterPages.NestedMasterPageTest2" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="body" runat="server">
</asp:Content>

然后更改了default.aspx.cs

protected override void OnPreInit(EventArgs e){
    this.MasterPageFile ="~/MasterPages/NestedMasterPageTest2.Master";
} 

我更改了default.aspx

<asp:Content ID="testContent" ContentPlaceHolderID="Content2" runat="server">
This is a test which uses a nested master page!
</asp:Content>

它会返回一个错误,上面写着Cannot find ContentPlaceHolder 'Content2' in the master page '/MasterPages/NestedMasterPageTest2.Master', verify content control's ContentPlaceHolderID attribute in the content page.,但Content2位于NestedMasterPageTest2。这里真的发生了什么?

2 个答案:

答案 0 :(得分:1)

您的嵌套母版页具有内容控件但没有ContentPlaceHolder控件。尝试添加它:

<asp:ContentPlaceHolder ID="cplh" runat="server">
</asp:ContentPlaceHolder>

然后,在Default.aspx中:

<asp:Content ID="cnt1" ContentPlaceHolderID="cplh" runat="server">
  This is a test which uses a nested master page!
</asp:Content>

答案 1 :(得分:1)

您需要在嵌套母版页中添加<asp:ContentPlaceholder>标记:

<asp:Content ID="basebody" ContentPlaceHolderID="body" runat="server">
    <asp:ContentPlaceHolder ID="Content2" runat="server">
    </asp:ContentPlaceHolder>
</asp:Content>