QA@IT
«回答へ戻る

回答を投稿

PostBackUrlを指定するとそちらにPostしてしまいますのでイベントが思うように発生しないでしょう。

PostBackUrlを設定せずに、LinkButtonのイベントハンドラでRedirect等するようにしてみてください。

質問で説明されてたコードにそって書くと以下の様になるでしょうか

Sitem.Master の リンク

<p><asp:LinkButton ID="GotoWebForm1Link" runat="server">WebForm1</asp:LinkButton></p>
<p><asp:LinkButton ID="GotoWebForm2Link" runat="server">WebForm2</asp:LinkButton></p>

<asp:ContentPlaceHolder ID="MainContent" runat="server">
</asp:ContentPlaceHolder>

WebForm1.aspx

SessionInfoTextBoxというTextBoxを追加しています。

<%@ Page Title="WebForm1" Language="VB" AutoEventWireup="true" MasterPageFile="~/Site.Master" CodeBehind="WebForm1.aspx.vb" Inherits="WebApplication1.WebForm1" %>
<asp:Content runat="server" ID="Main" ContentPlaceHolderID="MainContent">
    <asp:TextBox ID="TextBox1" runat="server" Text="Sample"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" Text="Button" />
    <div>
    <asp:TextBox ID="SessionInfoTextBox" runat="server" Text="" Width="148px"></asp:TextBox>
    </div>    

</asp:Content>

WebForm2.aspx

WebForm1と大体同じです。
違いは、Page ディレクティブ( <%@ Page の行 )と ID TextBox1TextBox2 に変えます。
(質問のコードがそうだったので)

WebForm1.aspx.vb

Imports Microsoft.Ajax.Utilities
Imports WebGrease

Public Class WebForm1
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim gotoWebForm1 As LinkButton = DirectCast(Master.FindControl("GotoWebForm1Link"), LinkButton)
        AddHandler gotoWebForm1.Click, AddressOf MasterLinkButton_Click
        Dim gotoWebForm2 As LinkButton = DirectCast(Master.FindControl("GotoWebForm2Link"), LinkButton)
        AddHandler gotoWebForm2.Click, AddressOf MasterLinkButton_Click

        ' テキストボックスに表示する
        SessionInfoTextBox.Text = ""
        Dim f = New Func(Of String, String) _
                (Function(x) As String
                     If Session(x) IsNot Nothing Then Return Session(x).ToString() Else Return ""
                 End Function)
        SessionInfoTextBox.Text += String.Format("{0} , {1}", f("text"), f("text2"))

    End Sub

    Protected Sub MasterLinkButton_Click(sender As Object, e As EventArgs)
        Debug.Print("MasterLinkButton_Click on WebForm1")
        Session("text") = Me.TextBox1.Text
        Response.Redirect("WebForm2.aspx")
    End Sub

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Session("text") = Me.TextBox1.Text
        Response.Redirect("WebForm2.aspx")
    End Sub
End Class

WebForm2.aspx.vb

Page_LoadはWebForm1.aspx.vbと同じ。Session変数名などが異なる。

    Protected Sub MasterLinkButton_Click(sender As Object, e As EventArgs)
        Debug.Print("MasterLinkButton_Click on WebForm2")
        Session("text2") = Me.TextBox2.Text
        Response.Redirect("WebForm1.aspx")
    End Sub

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Session("text2") = Me.TextBox2.Text
        Response.Redirect("WebForm1.aspx")
    End Sub

PostBackUrlを変更できないならClientClickなどを使って上手く反映されるようにするとかでしょうか。
そちらは試してません。

PostBackUrlを指定するとそちらにPostしてしまいますのでイベントが思うように発生しないでしょう。

PostBackUrlを設定せずに、LinkButtonのイベントハンドラでRedirect等するようにしてみてください。

質問で説明されてたコードにそって書くと以下の様になるでしょうか

Sitem.Master の リンク
```xml
<p><asp:LinkButton ID="GotoWebForm1Link" runat="server">WebForm1</asp:LinkButton></p>
<p><asp:LinkButton ID="GotoWebForm2Link" runat="server">WebForm2</asp:LinkButton></p>

<asp:ContentPlaceHolder ID="MainContent" runat="server">
</asp:ContentPlaceHolder>
```

**WebForm1.aspx**

SessionInfoTextBoxというTextBoxを追加しています。

```xml
<%@ Page Title="WebForm1" Language="VB" AutoEventWireup="true" MasterPageFile="~/Site.Master" CodeBehind="WebForm1.aspx.vb" Inherits="WebApplication1.WebForm1" %>
<asp:Content runat="server" ID="Main" ContentPlaceHolderID="MainContent">
    <asp:TextBox ID="TextBox1" runat="server" Text="Sample"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" Text="Button" />
    <div>
    <asp:TextBox ID="SessionInfoTextBox" runat="server" Text="" Width="148px"></asp:TextBox>
    </div>    

</asp:Content>
```

**WebForm2.aspx**

WebForm1と大体同じです。
違いは、Page ディレクティブ( `<%@ Page` の行 )と ID `TextBox1` を `TextBox2` に変えます。
(質問のコードがそうだったので)


**WebForm1.aspx.vb**
```vb
Imports Microsoft.Ajax.Utilities
Imports WebGrease

Public Class WebForm1
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim gotoWebForm1 As LinkButton = DirectCast(Master.FindControl("GotoWebForm1Link"), LinkButton)
        AddHandler gotoWebForm1.Click, AddressOf MasterLinkButton_Click
        Dim gotoWebForm2 As LinkButton = DirectCast(Master.FindControl("GotoWebForm2Link"), LinkButton)
        AddHandler gotoWebForm2.Click, AddressOf MasterLinkButton_Click

        ' テキストボックスに表示する
        SessionInfoTextBox.Text = ""
        Dim f = New Func(Of String, String) _
                (Function(x) As String
                     If Session(x) IsNot Nothing Then Return Session(x).ToString() Else Return ""
                 End Function)
        SessionInfoTextBox.Text += String.Format("{0} , {1}", f("text"), f("text2"))

    End Sub

    Protected Sub MasterLinkButton_Click(sender As Object, e As EventArgs)
        Debug.Print("MasterLinkButton_Click on WebForm1")
        Session("text") = Me.TextBox1.Text
        Response.Redirect("WebForm2.aspx")
    End Sub

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Session("text") = Me.TextBox1.Text
        Response.Redirect("WebForm2.aspx")
    End Sub
End Class
```

**WebForm2.aspx.vb**

Page_LoadはWebForm1.aspx.vbと同じ。Session変数名などが異なる。

```vb
    Protected Sub MasterLinkButton_Click(sender As Object, e As EventArgs)
        Debug.Print("MasterLinkButton_Click on WebForm2")
        Session("text2") = Me.TextBox2.Text
        Response.Redirect("WebForm1.aspx")
    End Sub

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Session("text2") = Me.TextBox2.Text
        Response.Redirect("WebForm1.aspx")
    End Sub
```


PostBackUrlを変更できないならClientClickなどを使って上手く反映されるようにするとかでしょうか。
そちらは試してません。