如何使用master从asp:content页面访问母版页上的用户控件?

时间:2009-08-06 18:16:47

标签: asp.net user-controls master-pages

我不断收到这些请求“让我成为xyz的工具”,我们提出了web app

所以在第三个之后,我意识到将它们整合在一起并使用母版页会更容易。

我有一个名为MessageCenter的用户控件,我用它来处理错误,成功和信息性消息,所以我把它放在母版页上。

<%@ Master Language="VB" CodeFile="tfMasterPage.master.vb" Inherits="tfMasterPage" %>

<%@ Register Src="MessageCenter/msgCenter.ascx" TagName="msgCenter" TagPrefix="uc1" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>INSERT TITLE HERE</title>
    <link href="Stylesheets/EogTool.css" rel="stylesheet" type="text/css" />
    <link href="stylesheets/TF_Main_Styles.css" rel="stylesheet" type="text/css" />
    <link href="stylesheets/TF_Print_Styles.css" rel="stylesheet" type="text/css" media="print" />
</head>
<body style="background-color: #eeeeee">
    <form id="form1" runat="server">
        <div class="page">
            <div class="headerArea">
                <div class="LogoImg">
                    <img alt="Transparency Florida" src="images/TF_Logo.jpg" /></div>
                <div class="SealImg">
                    <img alt="Shining the Light on Florida's Budget" src="images/TF_Seal.jpg" /></div>
            </div>
            <div class="content">
                <h1>
                    FIS - EOG Table Maintenance</h1>
            </div>
            <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <div>
                <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                    <ContentTemplate>
                        <div class="content">
                            <div>
                                <uc1:msgCenter ID="MsgCenter1" runat="server" />
                            </div>
                            <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">

...

通常情况下,当msgcenter位于常规的aspx页面上时,我会调用它的方法和代码隐藏中的东西,如下所示:

...

    rtn = dal.deleteRow(CInt(e.CommandArgument), currentTab())
    If Not IsNumeric(rtn) Then
        MsgCenter1.addMessage("An Error occured deletion" & rtn, , , , "E")
    Else
        MsgCenter1.addMessage("Delete Successful", , , , "S")
    End If
    bindGrid()
    MsgCenter1.Visible = True
End Sub

但是当我尝试使用母版页从页面上的asp:content事件中执行此操作时,它告诉我未声明msgCenter1。这是某种范围问题。

我读过关于使用像

这样的findcontrol
ctype(master.findcontrol("tbWhatever"), textbox).text = "FOO"

但是当我尝试强制转换为我的用户控件时,它会抱怨,因为它再次被声明。

我觉得好像我只是错过了一块拼图,但是从昨天下午4点左右起就一直在躲避我。

任何建议,指示或链接都将非常受欢迎。

感谢。

3 个答案:

答案 0 :(得分:10)

首先将此指令添加到您要访问母版页的内容页面

<%@ MasterType VirtualPath="~/NameOfMasterPage.master"%>

其次,在母版页上设置一个返回您要访问的控件的公共属性

public Label MasterLabel
        {
            get
            {
                return lblMaster;
            }
            private set
            {
                //do nothing
            }
        }

最后只需访问内容页面中的控件

Master.MasterLabel.Text = "Hello from the content page!";

答案 1 :(得分:1)

我知道您的问题已经得到解答,这不适用于此,但我注意到您为“MessageCenter”控件传递了1个长度字符。我会使用Enum而不是字符串来使您的代码变得不那么脆弱。现在,您可以将“fart”作为参数传递,它将编译得很好。 Enum将为您提供一些编译时检查,并避免在运行时出现任何问题。

示例:

Message.Success
Message.Error
Message.Warning

答案 2 :(得分:1)

这就是我用过的东西。

Master.FindControl("ControlID").Visible = false;