ターゲット ページと前のページの両方に masterpage がある PostbackUrl の実例を教えてください。
たとえば、default1.axpxとdefault2.aspxの 2 つのページがあるとします。どちらにもマスターページ MyMasterpage.masterpageがあります
default1.aspxからdefault2.aspxにポストバックし、default2 ページの default1 ページ コントロールからデータを抽出します。
どうやってやるの?
ターゲット ページと前のページの両方に masterpage がある PostbackUrl の実例を教えてください。
たとえば、default1.axpxとdefault2.aspxの 2 つのページがあるとします。どちらにもマスターページ MyMasterpage.masterpageがあります
default1.aspxからdefault2.aspxにポストバックし、default2 ページの default1 ページ コントロールからデータを抽出します。
どうやってやるの?
この質問に「コントロールを見つけるにはどうすればよいContentPlaceholder
ですか?」というタイトルを付ける必要があります。問題はそれが機能しないということでPreviousPage
はなく、どのように機能するかを理解していないということですContentPlaceholder
。
この問題は、マスターページ自体とは関係がなくContentPlaceholder
、asp.net用語での名前付けコンテナーであるの使用に完全に関連しています。 FindControls
ネーミングコンテナ内を検索しません。これはまさにそれらが設計されている方法です。
PreviousPage
マスターページでは問題なく動作するため、マスターページがあなたの問題と何の関係があるのかについての私の混乱。前のページの任意のプロパティにアクセスでき、実際に機能します。例えば:
HtmlForm form = PreviousPage.Form; // this works fine
Control ctrl = PreviousPage.Master.FindControl("TextBox1"); // this works as well
発生する可能性のある問題はFindControl()
、コンテンツページで特定のコントロールを検索するために使用しようとしているが、それが機能していないことです。これは、コントロールが制御するネーミングコンテナではなく、PreviousPageでFindControlを呼び出しているためです。に存在するものを探しています。
必要なコントロールを見つけるにはFindControl
、ネーミングコンテナでを実行する必要があります。次のコードは、プレースホルダーの名前がContentPlaceHolder1であると仮定すると正常に機能します。
var ph = PreviousPage.Controls[0].FindControl("ContentPlaceHolder1");
var ctl = ph.FindControl("TextBox1");
PreviousPage
次のコードを使用して、この問題が何の関係もないことを確認できます。このコードは、単一のページのみを使用し、それ自体でコントロールを検索します。TextBox1というTextBoxをDefault.aspxページに配置します。次に、Page_Load
Default.aspx.csの背後にあるコードの機能にこのコードを配置し、デバッガーで実行してステップスルーします。
protected void Page_Load(object sender, EventArgs e)
{
// Following code should find the control, right? Wrong. It's null
var ctrl = Page.FindControl("TextBox1");
// assuming your content placeholder in the masterpage is called MainContent, this works.
var ctrl = Page.Controls[0].FindControl("MainContent").FindControl("TextBox1");
}
ですから、「ページにマスターページがあると、正しく機能しない」などと言ってはいけPreviousPage
ません。正しく機能しているからです。問題は、それがどのように機能するかわからないことです。ページオブジェクトモデルがどのように機能するかを学びます。
あなたはこれを試してください
これは最初のページです
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Button1_Click(object sender, System.EventArgs e) {
Label1.Text = "Your city name: " +
TextBox1.Text.ToString();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>PostBackUrl Example: how to submit a page to another page in asp.net</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Font-Size="Large" ForeColor="DarkSlateBlue"></asp:Label>
<br />
<asp:Label ID="Label2" runat="server" Text="Your City" AssociatedControlID="TextBox1"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" Text="*"></asp:RequiredFieldValidator>
<br />
<asp:Button ID="Button1" runat="server" Text="Submit in this page" OnClick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="Submit in city page" PostBackUrl="~/CityPage.aspx" />
</div>
</form>
</body>
</html>
2 ページ目
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, System.EventArgs e) {
TextBox PP_TextBox1;
PP_TextBox1 = (TextBox)PreviousPage.FindControl("TextBox1");
Label1.Text = "Your City: " +
PP_TextBox1.Text;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>City Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>City Page</h1>
<asp:Label ID="Label1" runat="server" Font-Size="Large" ForeColor="Crimson"></asp:Label>
</div>
</form>
</body>
</html>
私はこれがあなたを助けると思う....