QA@IT

ASP.NET(VB)でのマスターページのリンクボタンにコンテンツ保存機能を持たせたい

4607 PV

こんにちわ。お世話になります。

ASP.NET(VB)でのマスターページのリンクボタンにコンテンツ保存機能を持たせたい

アンケートのような画面を作成しています。
構成は
Site1.master
・マスターページにリンクボタンを二つ作成しそれぞれPostBackUrlに
WebForm1.aspxとWebForm2.aspxを設定しジャンプするように指定。

WebForm1.aspx(MasterPageFile="~/Site1.master")
・ボタンを配置しクリックイベントに下記処理(結果をセッションに保存し次の画面へリダイレクト)
Session("text") = Me.TextBox1.Text
Response.Redirect("WebForm2.aspx")

WebForm2.aspx(MasterPageFile="~/Site1.master")
・ボタンを配置しクリックイベントに下記処理(結果をセッションに保存し次の画面へリダイレクト)
Session("text2") = Me.TextBox2.Text
Response.Redirect("Top.aspx")

このような構成になっており、各コンテンツページに保存するボタンを設置し保存させるのですが
マスターページに画面遷移用のリンクボタンを用意しておりこちらを押下すると
各画面に遷移する前に入力中の画面を保存してから遷移を行う予定です。

マスターページのリンクボタンをクリックしコンテンツページの内容を保存してから
画面遷移させるシンプルな方法はありますか?

当方で試した方法は、コンテンツページにマスターページのリンクボタンクリックイベントの
イベントハンドラを追加してイベントを検出し保存させるやり方を試したのですが
画面遷移後に保存処理が走ってしまい望んでいる結果が得られませんでした。。。

1.WebForm1にてアンケート入力(保存ボタン押下なし)
2.マスターページのリンクボタンをクリック(WebForm2遷移用)
3.WebForm2に遷移しここで保存処理が走ってしまう。

各コンテンツページの保存ボタンを押下しない場合入力内容が飛んでしまうので
このような機能を持たせたいのですが良い方法はありますか?

  • ご自分の環境(OS, .NET, IIS, Visual Studio のバージョン、ブラウザを使っているなら何かなど)に関する情報を書いていただけないのでしょうか? クロスページポストバックを使っているのはなぜですか? 「各コンテンツページに保存」とはどういうことですか? 「内容が飛んでしまう」とはどういうことですか? -

回答

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などを使って上手く反映されるようにするとかでしょうか。
そちらは試してません。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。