【问题标题】:how to add controls to the masterpage's content placeholder programmatically如何以编程方式将控件添加到母版页的内容占位符
【发布时间】:2025-12-05 04:30:01
【问题描述】:

在 base.master 上:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Base.master.cs" Inherits="WebApplicationControlTest.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>
        There is a content here: <br />
        <asp:ContentPlaceHolder ID="body" runat="server">
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

在嵌套母版上

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

<asp:Content ID="PlaceHolder" ContentPlaceHolderID="body" runat="server">
    This is inside the NestedPage<br />
    <asp:ContentPlaceHolder ID="PlaceHolderLeft" runat="server">
    </asp:ContentPlaceHolder>
    <asp:ContentPlaceHolder ID="PlaceHolderRight" runat="server">
    </asp:ContentPlaceHolder>
</asp:Content>

在 default.aspx 上

<asp:Content ID="PlaceHolder" ContentPlaceHolderID="PlaceHolderLeft" runat="server">
    This is a test!
</asp:Content>

在 default.aspx.cs 上

protected override void OnPreInit(EventArgs e){
    Control control = LoadControl("TheUrlOfTheControl.ascx");
    if (Page.Master.FindControl("body") != null) {
        Page.Master.FindControl("body").Controls.Add(control);
    }
}

我需要将控件添加到正文内容占位符的最后部分,但 FindControl 确实返回 null...我们如何以编程方式将控件添加到母版页的内容占位符?

谢谢

【问题讨论】:

    标签: master-pages findcontrol contentplaceholder


    【解决方案1】:

    已回答以供将来参考

    protected override void OnPreInit(EventArgs e){
        Control control = LoadControl("TheUrlOfTheControl.ascx");
        Control placeHolderControl = Page.FindControl("body");
        if (placeHolderControl != null) {
            placeHolderControl.Controls.Add(control);
        } else {
            MasterPage theMaster = Page.Master;
            while (theMaster != null) {
                placeHolderControl = theMaster.FindControl("body");
                if (placeHolderControl != null) {
                    placeHolderControl.Controls.Add(control);
                    break;
                }
                theMaster = theMaster.Master;
            }
        }
    }
    

    【讨论】:

    • 谢谢,这对我有用。但我已将此代码放在母版页加载事件上,页面加载和母版页加载有什么区别吗?
    • “LoadControl”方法在代码中是如何工作的?是否需要添加任何引用才能使用此方法?