2012-01-08 98 views
2

我真的很苦恼。问题只在于内容页面。
我试图从另一个内容页面(“Page2.aspx”)中的一个内容页面(“Page1.aspx”)访问文本框值。我不确定是否它们是嵌套母版页的孩子是相关的,但我想我会把它扔进去。使用嵌套主页访问内容页面的控制

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

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

Page2.aspx是一种新的形式,应该从以前的页面文本框的值来填充。 第二行显示<%@ PreviousPageType VirtualPath =“〜/ Page1.aspx”%>
出于测试目的,我使用标签(“lblResult”)来显示我的结果。

代码隐藏看起来是这样的:

 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标签文本说,“没有找到文本”。

我认为这是所有的相关信息。任何人有任何想法?我花了整整一个下午来讨论论坛,没有尝试过。

回答

3

我不知道它是否是相关的,他们是 嵌套母版页的孩子,但我想我会扔进去。

MasterPage究竟是什么导致这个问题。使用Page.FindControl("ControlID"),您无法使用MasterPage在页面上找到控件,因为该页面不是TextBox的NamingContainer,而是ContentPlaceholder。 MasterPage页面的ControlCollection中唯一的控件是MasterPage本身。

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

这里有一些方法你怎么可以从第二页访问文本框:

  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以URL参数,以便它不要求Page2'sPreviousPagePage1

  4. 最后但并非最不重要。如果您将Server.TranserpreserveForm设置为tue,则可以通过参考Request.Form("TbFirst")来检索原始页面TextBox控件的值。

注意:我不建议recursive FindControl方法(从MasterPage开始),因为它也将硬连线两个页面,并会

  • 严重错误的原因
  • 不透明
+1

谢谢 - 有一些多汁的想法在那里,我需要先睡觉,然后给它一个试试吧! – bjh 2012-01-08 22:24:07

+0

谢谢蒂姆。第一次(解决方案和变体)已经多次尝试失败。 – bjh 2012-01-09 09:43:05

+0

谢谢@Tim。第一种解决方案(和变体)已经多次尝试失败。解决方案2与3的URL参数一起出色地工作。在[如何:在ASP.NET网页之间传递值](http://msdn.microsoft.com/zh-cn/library/6c3yckfw.aspx)中找到这些解决方案中每个解决方案的详细信息,但在尝试获取一个的解决方案工作。感谢提供清晰度:-) – bjh 2012-01-09 09:50:35

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); 
    } 
}