使用母版页进行跨页回发的奇怪行为System.NullReferenceException

时间:2012-06-27 14:39:49

标签: c# exception-handling nullreferenceexception

我正在使用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:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <asp:Label ID="Label1" runat="server"></asp:Label>
        <br />
        <br />
        Address:&nbsp;&nbsp;&nbsp;&nbsp;
        <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");
    }
}
}

2 个答案:

答案 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()