使用嵌套母版页从内容页面访问控件

时间:2012-01-08 19:32:09

标签: c# asp.net

我真的很挣扎。问题仅出在内容页面上 我试图从另一个内容页面(“Page2.aspx”)中的一个内容页面(“Page1.aspx”)访问文本框值。我不确定它们是否是嵌套母版页的子项是相关的,但我想我会把它扔进去。

Page1.aspx 是一个带有文本框和提交按钮的基本表单。 Page1.aspx中的文本框称为“tbFirst”。提交按钮具有以下代码:

<asp:Button ID="Button1" runat="server" Text="New Member Form" PostBackUrl="Page2.aspx"/>    

Page2.aspx 是一个新表单,应使用上一页的文本框值填充。 第二行显示&lt;%@ PreviousPageType VirtualPath =“〜/ Page1.aspx”%&gt;
出于测试目的,我使用标签(“lblResult”)来显示我的结果。

Codebehind看起来像这样:

        if (PreviousPage != null)
        {
            TextBox SourceTextBox =
                (TextBox)PreviousPage.FindControl("tbFirst");
            if (SourceTextBox != null)
            {
                lblResult.Text = SourceTextBox.Text;
            }
            else
            {
                lblResult.Text = "No text found";
            }  
        }
        else
            {
            lblResult.Text = "No Control found";
            }
        }
        }

问题是Page2.aspx中的标签文字说“找不到文字”。

我认为这是所有相关信息。有人有任何想法吗?我花了整整一个下午在论坛上拖网,没有尝试过任何工作。

2 个答案:

答案 0 :(得分:3)

  

我不确定他们是否是孩子的相关性   嵌套的母版页,但我以为我会把它扔进去。

MasterPage正是导致此问题的原因。您无法使用Page.FindControl("ControlID")在包含MasterPage的页面上找到控件,因为Page不是TextBox的NamingContainer而是ContentPlaceholder。使用MasterPage的页面ControlCollection中唯一的控件是MasterPage本身。

原因:我最近answered a question that describes this behaviour

以下是从Page2:

访问TextBox的一些方法
  1. 您可能会对以下方法感到满意(最直接FindControl way)

    Page.Master.FindControl("ContentPlaceHolder1").FindControl("tbFirst");
    
  2. 另一种更好的方法是在Page1中提供一个返回tbFirst.Text的公共财产。然后,您可以通过以下方式从Page2

    访问它
    if (PreviousPage != null && PreviousPage is Page1){
        lblResult.Text = ((Page1)PreviousPage).TbFirstText;
    }
    
  3. 您还可以将Text添加为网址参数,这样就不需要Page2's PreviousPagePage1

  4. 最后但并非最不重要。如果您使用设置为preserveForm的{​​{3}}设置为tue,则可以通过引用TextBox来检索原始网页Request.Form("TbFirst")控件的值。

  5. 注意:我不建议使用Server.Transer方法(从MasterPage开始),因为它也会硬连接这两个页面并且会

    • 导致讨厌的错误
    • 不透明

答案 1 :(得分:0)

尝试使用此课程中的FindControlRecursive(this.Master, "tbFirst")

(将此类放在App_Code中)

using System.Web;
using System;
using System.Web.UI;
using System.Web.UI.WebControls;


/// <summary>
/// Summary description for ControlHelper
/// </summary>
public static class ControlHelper
{
    // Example: HtmlForm form = ControlHelper.FindControlRecursive(this.Master, "form1") as HtmlForm;
    /// <summary>
    /// Finds a Control recursively. Note finds the first match and exits
    /// </summary>
    /// <param name="ContainerCtl"></param>
    /// <param name="IdToFind"></param>
    /// <returns></returns>
    public static Control FindControlRecursive(this Control Root, string Id)
    {
        if (Root.ID == Id)
            return Root;

        foreach (Control Ctl in Root.Controls)
        {
            Control FoundCtl = FindControlRecursive(Ctl, Id);
            if (FoundCtl != null)
                return FoundCtl;
        }

        return null;
    }

    //ModifyControl<TextBox>(this, tb => tb.Text = "test");
    public static void ModifyControl<T>(this Control root, Action<T> action) where T : Control
    {
        if (root is T)
            action((T)root);
        foreach (Control control in root.Controls)
            ModifyControl<T>(control, action);
    }
}