【问题标题】:cannot access hiddenfield value in masterpage on page_load event from child page无法从子页面访问页面加载事件的母版页中的隐藏字段值
【发布时间】:2013-02-22 20:07:03
【问题描述】:

我正在尝试从在我的子 aspx 页面中设置的母版页访问隐藏字段值,但无法通过母版页代码隐藏 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 变量没有智能感知。

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

【问题讨论】:

  • 为什么您认为您可以访问母版页的内容页中的控件? MasterPage 用于多个页面,为什么要将其与特定页面硬链接,没有它就无法工作。如果HiddenField对于master的操作是必不可少的,你应该在那里声明它。
  • 你建议我做什么?对于每个子页面,有一个不同的 rpt 标题需要显示在母版页上。我怎样才能做到这一点?谢谢....
  • 然后内容页面可以访问它的主设置文本,反之则不行。

标签: asp.net master-pages webforms


【解决方案1】:

您可以在MasterPage 中添加以下代码:

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

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

上面的代码应该按照提供的方式工作,使用你的控件名称,我不确定你为什么使用:

.FindControl("MainContent_hid1");

而不是

.FindControl("hid1");

【讨论】:

  • 这是我尝试过的,但 hid1 不断出现空值。查看更新后的编辑我的页面现在的外观。无法弄清楚为什么它没有找到控件.....
  • 我已经编辑了答案,我认为 Label1 在我测试时将变为 null,并且在发布之前遇到了同样的问题。
  • 不,不是这样的......在调试过程中,hid1 出现空值。因此,它没有将 Label1 设置为一个值...不知道该怎么做...我很难过...这应该可以工作...标签位于 ContentPlaceHolder 之外。
  • 您已经尝试过:.FindControl("hid1") 而不是 .FindControl("MainContent_hid1")?
  • 知道了!调试后查看了Controls集合,发现控件的名字是“hid1”而不是“MainContent_hid1”
【解决方案2】:

为什么您认为您可以访问母版页的内容页中的控件? MasterPage 用于多个页面,为什么要将它与特定页面硬链接,没有它就无法工作。如果HiddenField对于master的操作是必不可少的,你应该在那里声明它。

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

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

您可以在 master 中提供公共属性,例如:

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】:

    你可以这样使用。
    您的母版页上可以有多个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

    【讨论】:

    • 可能和他一样,但我从答案中提供的链接中得到答案。
    • 谢克纳,谢谢。我实现了,但控件出现为空。我的隐藏字段位于 Maincontent 占位符内。我将编辑我的代码,让你看看我有什么,请评估并让我知道可能出了什么问题......非常感谢......
    • 知道了!调试后查看了Controls集合,发现控件的名字是“hid1”而不是“MainContent_hid1
    【解决方案4】:

    您可以引用母版页并获得这样的控件:

    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;
    

    【讨论】:

    • 我认为他想要相反。 (我知道问题标题令人困惑)
    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多