我正在使用C#ASP.NET,我做了一个跨页面回发,它工作正常,没有母版页。
但是在使用母版页时,同样的逻辑失败并得到上述错误。我是ASP.NET新手,请详细告诉我。
我的代码是
<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="View_Information.aspx.cs" Inherits="View_Information" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<p>
Module 3: Assignment 1</p>
<div>
Total Data You Have Entered
<br />
<br />
Name:
<asp:Label ID="Label1" runat="server"></asp:Label>
<br />
<br />
Address:
<asp:Label ID="Label2" runat="server"></asp:Label>
<br />
<br />
Thanks for submitting your data.<br />
</div>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="Placehodler2" Runat="Server">
</asp:Content>
背后的代码是
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class View_Information : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (PreviousPage != null && PreviousPage.IsPostBack)
{
TextBox nametextpb = (TextBox)PreviousPage.FindControl("TextBox1");
//Name of controls should be good to identify in case application is big
TextBox addresspb = (TextBox)PreviousPage.FindControl("TextBox2");
Label1.Text = nametextpb.Text; //exception were thrown here
Label2.Text = addresspb.Text;
}
else
{
Response.Redirect("Personal_Information.aspx");
}
}
}
答案 0 :(得分:2)
问题在于,使用母版页,您的控件现在需要放在ContentPlaceHolder
控件中。
FindControl方法可用于访问ID不是的控件 在设计时可用。该方法仅搜索页面 立即或顶级容器;它不会递归搜索 控件命名页面中包含的容器。访问 在从属命名容器中控件,调用FindControl 该容器的方法。
现在,您需要递归搜索控件,以便从TextBox
中找到PreviousPage
控件。你可以看到an example of that here。同样在该网站上注明,您可以通过其完整的UniqueID
来获取控件,在您的情况下,该控件将通过以下方式运行:
TextBox nametextpb = (TextBox)PreviousPage.FindControl("ctl00$ContentPlaceHolder1$TextBox1")
编辑:认为包含我用来定位目标控件的UniqueID
的代码不会有什么坏处。
在Page_Load中:
var ids = new List<string>();
BuildControlIDListRecursive(PreviousPage.Controls, ids);
方法定义:
private void BuildControlIDListRecursive(ControlCollection controls, List<string> ids)
{
foreach (Control c in controls)
{
ids.Add(string.Format("{0} : {2}", c.ID, c.UniqueID));
BuildControlIDListRecursive(c.Controls, ids);
}
}
然后从ids列表中找到您的控件。
答案 1 :(得分:0)
(TextBox)PreviousPage.FindControl("TextBox1");
必须返回null
,这意味着找不到控件。
请尝试使用Page.Master.FindControl()
。