1

我正在使用 C# ASP.NET,我做了一个跨页回发,它工作正常,没有母版页。

但是在使用 Master page 时,相同的逻辑失败并得到上述错误。我是 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");
    }
}
}
4

2 回答 2

2

问题是,对于母版页,您的控件现在需要放置在ContentPlaceHolder控件中。

FindControl 方法可用于访问其 ID 在设计时不可用的控件。该方法仅搜索页面的直接或顶级容器;它不会递归搜索页面中包含的命名容器中的控件。要访问从属命名容器中的控件,请调用该容器的 FindControl 方法。

您现在需要递归搜索控件以TextBoxPreviousPage. 你可以在这里看到一个例子。在该站点上还指出,您可以通过 full 获得控制权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 列表中找到您的控件。

于 2012-06-27T17:44:46.920 回答
0

(TextBox)PreviousPage.FindControl("TextBox1");must have returned null,表示未找到控件。

尝试Page.Master.FindControl()改用。

于 2012-06-27T15:17:30.220 回答