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 メソッドを呼び出します。

TextBoxからコントロールを見つけるには、コントロールを再帰的に検索する必要がありますPreviousPageその例をここで見ることができます。また、そのサイトに記載されているように、フルでコントロールを取得でき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);
    }
}

次に、ID リストからコントロールを見つけます。

于 2012-06-27T17:44:46.920 に答える
0

(TextBox)PreviousPage.FindControl("TextBox1");これはnull、コントロールが見つからなかったことを意味します。

Page.Master.FindControl()代わりに使用してみてください。

于 2012-06-27T15:17:30.220 に答える