我真的很苦恼这个问题。问题仅出在内容页面。
我正在尝试从一个内容页(“Page1.aspx”)访问另一个内容页(“Page2.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 中的标签文本显示“未找到文本”。
我认为这就是所有相关信息。有人有什么想法吗?我花了整个下午的时间在论坛上搜索,但我尝试过的任何方法都不起作用。
最佳答案
I'm not sure whether it is relevant that they are the children of nested master pages, but I thought I'd throw it in.
MasterPage
正是导致此问题的原因。您无法使用 Page.FindControl("ControlID")
在 MasterPage 页面上查找控件,因为该页面不是 NamingContainer TextBox 的内容,但 ContentPlaceholder
的内容。页面 ControlCollection
中具有 MasterPage 的唯一控件是 MasterPage 本身。
原因:我最近answered a question that describes this behaviour .
以下是从 Page2 访问 TextBox 的一些方法:
您可能会幸运地使用以下方法(最直接的
FindControl方式)
:Page.Master.FindControl("ContentPlaceHolder1").FindControl("tbFirst");
另一种更好的方法是在
Page1
中提供一个返回tbFirst.Text
的公共(public)属性。然后您可以通过以下方式从Page2
访问它:if (PreviousPage != null && PreviousPage is Page1){ lblResult.Text = ((Page1)PreviousPage).TbFirstText; }
您还可以添加
Text
作为 URL 参数,这样就不需要Page2 的
PreviousPage
为第1页
。最后但并非最不重要的一点。如果您使用Server.Transer将
preserveForm
设置为 tue,您将能够通过引用Request.Form("TbFirst")
检索原始页面TextBox
控件的值>.
注意:我不推荐 recursive FindControl方法(从 MasterPage
开始),因为它也会对两个页面进行硬连线,并且会是
- 导致严重错误的原因
- 慢
- 不透明
关于c# - 从具有嵌套母版页的内容页访问控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8780541/