【问题标题】:access master page user control from child page从子页面访问母版页用户控件
【发布时间】:2017-12-23 06:39:11
【问题描述】:

我有一个包含用户控件的母版页。 现在 Abc.aspx 是该母版页的子页。现在,子页也有一个用户控件。 我的要求是从子页面的用户控件中获取母版页的用户控件。

母版页 aspx

<%@ Master Language="C#" MasterPageFile="~/masterhome.Master" AutoEventWireup="true" CodeBehind="lmsmasternew.master.cs" Inherits="e2aPortal.LMS.lmsmasternew" %>

<%@ Register Src="~/homeUserControl/UserProfilePic.ascx" TagPrefix="uc1" TagName="UserProfilePic" %>
<%@ Register Src="~/homeUserControl/MuduleListLeftPanel.ascx" TagPrefix="uc1" TagName="MuduleListLeftPanel" %>



<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <title></title>
    <script src='<%# ResolveUrl("~/Scripts/jquery-1.4.1-vsdoc.js") %>' type="text/javascript"></script>
    <script src='<%# ResolveUrl("~/Scripts/jquery-1.11.1.min.js") %>'></script>
    <link href='<%# ResolveUrl("~/StyleSheet/profilesidebar.css") %>' rel="stylesheet" />
    <link href='<%# ResolveUrl("~/StyleSheet/font-awesome.css") %>' rel="stylesheet" />
    <link href='<%# ResolveUrl("~/Content/bootstrap.min.css") %>' rel="stylesheet" />
    <script type="text/javascript">
        function openpage(pagename) {

            $("#maincontent").load(pagename + ".aspx #maincontent", function () {
                // make content visible with effect   

            });
        }
    </script>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <div class="form-group">
        <div class="row" style="margin-top: 5%;">
            <div class="col-xs-3">
                <uc1:UserProfilePic runat="server" ID="UserProfilePic" />
                <asp:Label runat="server" ID="lbl1"></asp:Label>
                <br />
                <uc1:MuduleListLeftPanel runat="server" ID="MuduleListLeftPanel" />
            </div>
            <div class="col-xs-9">
                <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
                </asp:ContentPlaceHolder>
            </div>
        </div>
    </div>
</asp:Content>

用户控件aspx(用于母版页)

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MuduleListLeftPanel.ascx.cs" Inherits="e2aPortal.homeUserControl.MuduleListLeftPanel" %>

现在继承该母版页的子页面

<%@ Page Title="" Language="C#" MasterPageFile="~/LMS/lmsmasternew.master" AutoEventWireup="true" CodeBehind="CreateQuestionTemplate.aspx.cs" Inherits="e2aPortal.LMS.CreateQuestionTemplate" %>

<%@ Register Src="~/LMS/UserControl/CreateTemplate.ascx" TagPrefix="uc1" TagName="CreateTemplate" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <uc1:CreateTemplate runat="server" ID="CreateTemplate" />
</asp:Content>

现在子页面的用户控件

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CreateTemplate.ascx.cs" Inherits="e2aPortal.LMS.UserControl.CreateTemplate" %>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.9/jquery-ui.js" type="text/javascript"></script>
<link href="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.9/themes/start/jquery-ui.css" rel="stylesheet" type="text/css" />

现在子页面的用户控件代码隐藏

protected void Page_Load(object sender, EventArgs e)
        {
            MuduleListLeftPanel control = Page.Master.FindControl("MuduleListLeftPanel") as MuduleListLeftPanel;
            //Label control1 = Page.Master.FindControl("lbl1") as Label;

            if (control != null)
            {
                control.Visible = false;  // will not going to execute :D
            }
        }

我的要求是隐藏此特定页面的 MasterPage 的用户控件。

更新: 得到了我的解决方案。 感谢This Post

面临的问题

MuduleListLeftPanel muduleListLeftPanel = this.Master.LeftPanel;
UserProfilePic userProfile = this.Master.UserProfile;
muduleListLeftPanel.Visible = false; // hide sucessfully
userProfile.Attributes["style"] = "display:none"; // non working .. I need to use display none.. for both user control

【问题讨论】:

标签: c# asp.net


【解决方案1】:

由于父级中的 UserControl 是 protected,因此您需要一个 public 函数来更新控件并从子级访问它。

例如,在母版页中:

 public partial class SiteMaster : System.Web.UI.MasterPage
 {
     public void SetMyUserControlVisibility(bool visible)
     {
         MyUserControl.Visible= visible;
     }
 }

现在只需在子页面中:

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            SiteMaster masterPage = (SiteMaster)this.Page.Master;

            // update master page's user control here
            masterPage.SetMyUserControlVisibility(true);
        }
    }
}

【讨论】:

    【解决方案2】:

    首先,使用母版页上的FindControl 找到用户控件(ID 为UserControlOnMaster)。因此,在位于页面上的用户控件中的某处,使用此代码。

    WebUserControl1 control = Page.Master.FindControl("UserControlOnMaster") as WebUserControl1;
    

    找到后,您可以访问该用户控件中的其他控件。

    Label LabelOnMaster = control.FindControl("Label1") as Label;
    LabelOnMaster.Text = "Control found!";
    

    【讨论】:

    • 是的,我已经这样做了,我的代码仍然没有帮助..protected void Page_Load(object sender, EventArgs e) { System.Web.UI.UserControl control = Page.Master?.FindControl( "MuduleListLeftPanel") 作为 System.Web.UI.UserControl; // 从子页面获取用户控件 if (control == null) { throw new NullReferenceException("Invalid object"); } }
    • 你必须搜索正确的用户控件类型,而不是UserControl,而是WebUserControl1,就像我的回答中一样
    • 先生,我已经更新了我的代码,但仍然遇到同样的错误。我还发布了我正在使用的代码。
    • 您的lbl1 不在用户控件中,而是在主控器本身上(即Page.Master.FindControl("lbl1"))。如果你想隐藏控件,为什么不使用control.Visible = false;
    • 感谢您的回复先生,实际上,我是通过在母版页上添加标签来测试的,我认为访问 UserControl 时可能会出现问题,但我错了,同样的问题正在发生标也。我已经更新了我的代码@VDWWD 先生
    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多