无法从子页面访问页面加载事件中的母版页中的隐藏字段值

时间:2013-03-07 14:55:53

标签: asp.net master-pages webforms

我正在尝试从我的子aspx页面中设置的母版页中访问一个隐藏字段值,但无法访问masterpage codebehind page_load事件。

儿童aspx页面:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server">
<telerik:RadStyleSheetManager ID="RadStyleSheetManager1" runat="server">
</telerik:RadStyleSheetManager>
<div class="center_content">
    <div style="text-align: left">
        <h2>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        </h2>
    </div>
    <div style="text-align: left">
        <uc1:Chart ID="Chart1" runat="server" />
    </div>
    &nbsp;</div>
    <asp:HiddenField ID="hid1" runat="server" Value="Satellite Availability % Report" />

母版页:

<asp:Label runat="server" ID="Label1" Style="text-align: right; font-size: xx-large; color: #808080"></asp:Label>

后面的母版页代码:这是我想从子页面设置报告文本值的地方。

protected void Page_Load(object sender, EventArgs e)
    {
        HiddenField hid1 = (HiddenField)MainContent.FindControl("MainContent_hid1");
    if (hid1 != null)
    {
        Label1.Text = hid1.Value;
    }        }
<input type="hidden" name="ctl00$MainContent$hdnRptTitle" id="MainContent_hdnRptTitle" value="Satellite Availability % Report" />

hdnRptTitle变量没有智能感知。

我怎样才能让它发挥作用?看起来很简单,但不知道为什么它不起作用......

4 个答案:

答案 0 :(得分:1)

您可以在MasterPage

中添加以下代码
HiddenField hid1 = (HiddenField)MainContent.FindControl("hid1");
if (hid1 != null)
{
     Label1.Text = hid1.Value;
}

编辑:确保Label上的MasterPage位于ContentPlaceHolder之外,因为我在第一次测试时犯了这个错误。

以上代码应该按照提供的方式使用您的控件名称,我不确定您使用的原因:

.FindControl("MainContent_hid1");

而不是

.FindControl("hid1");

答案 1 :(得分:1)

你可以这样使用。
您的母版页上可以有多个conterntPlaceHolder 在这种情况下,使用包含hidden field的ID,我认为它是ContentPlaceHolder1

   HiddenField hid1 = (HiddenField)ContentPlaceHolder1.FindControl("hdnRptTitle");
   if (hid1 != null)
   {
     Label1.Text = hid1.Value;
   }

so上有类似的帖子
How to access content page controls from master page in asp.net

答案 2 :(得分:0)

为什么您认为可以访问母版页的内容页面中的控件? MasterPage用于多个页面,为什么要将其与特定页面进行硬链接,没有它就不再有效。如果HiddenField对于主人的操作至关重要,你应该在那里声明它。

  

对于每个子页面,都需要有不同的rpt标题   显示在母版页上。我怎么能做到这一点?

然后内容页面可以访问它的主文件以设置文本,但反之亦然。

您可以在主人中提供公共财产,例如:

public string ReportTitle
{
    get { return this.LblReportTitle.Text; }
    set { this.LblReportTitle.Text = value; }
}

并在ContentPage中,例如在Page_Load中:

protected void Page_Load(object sender, EventArgs e)
{
    // assuming the type of your master is SiteMaster
    var master = this.Master as SiteMaster;
    if (master != null)
        master.ReportTitle = hdnRptTitle.Value;
}

这种方法仍然将主人与其中一个(或多个)的孩子联系起来,但如果内容页面使用不同的主人类型,它仍然会“起作用”。如果有人删除或更改属性,您也会收到编译器错误的通知。

但是,内容存储报告类型或主数据显示的位置是实现细节,将来可以更改而不会破坏任何内容。

答案 3 :(得分:0)

您可以引用母版页并获得如下控件:

VB.Net:

Dim te As HiddenField
Dim val As String

te = Me.Page.Master.FindControl("hdnRptTitle")
val = te.Value

C#:

HiddenField te = default(HiddenField);
string val = null;

te = this.Page.Master.FindControl("hdnRptTitle");
val = te.Value;