我真的很挣扎。问题仅出在内容页面上 我试图从另一个内容页面(“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中的标签文字说“找不到文字”。
我认为这是所有相关信息。有人有任何想法吗?我花了整整一个下午在论坛上拖网,没有尝试过任何工作。
答案 0 :(得分:3)
我不确定他们是否是孩子的相关性 嵌套的母版页,但我以为我会把它扔进去。
MasterPage
正是导致此问题的原因。您无法使用Page.FindControl("ControlID")
在包含MasterPage的页面上找到控件,因为Page不是TextBox的NamingContainer而是ContentPlaceholder
。使用MasterPage的页面ControlCollection
中唯一的控件是MasterPage本身。
原因:我最近answered a question that describes this behaviour。
以下是从Page2:
访问TextBox的一些方法您可能会对以下方法感到满意(最直接FindControl way)
:
Page.Master.FindControl("ContentPlaceHolder1").FindControl("tbFirst");
另一种更好的方法是在Page1
中提供一个返回tbFirst.Text
的公共财产。然后,您可以通过以下方式从Page2
:
if (PreviousPage != null && PreviousPage is Page1){
lblResult.Text = ((Page1)PreviousPage).TbFirstText;
}
您还可以将Text
添加为网址参数,这样就不需要Page2's
PreviousPage
为Page1
。
最后但并非最不重要。如果您使用设置为preserveForm
的{{3}}设置为tue,则可以通过引用TextBox
来检索原始网页Request.Form("TbFirst")
控件的值。
注意:我不建议使用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);
}
}