- PR -

画面遷移でのセッション情報引継ぎ

1
投稿者投稿内容
DotNet初心者
会議室デビュー日: 2008/10/09
投稿数: 4
投稿日時: 2008-10-09 13:39
DotNet初心者です。

初めてASP.NETを使っています。
メール送信のページを作っているのですが画面遷移させるときのセッション情報引継ぎで悩んでいます。
もともとはCGI(PHP)で作ってあったのですが、ASP.NETに移行させることになって困っています。

動作は
 1)入力画面 → 2)確認画面 → 3)メール送信VB
と考えています。

メール送信VB:
メール送信させるVBは何とか出来てます。
内容は、確認画面から
<form id="form1" METHOD="POST" action="メール送信.aspx">
でPOSTされるとセッションに登録された内容をすべて
メール送信させてます。

確認画面:
"入力画面"からPOSTされたセッション情報の内容をすべて
LabelのTextに割り当て表示させ。
<input type=hidden name={0} value={1} />
タグを埋め込んでメール送信VBにセッション情報を渡して
います。

入力画面:
当初は通常のHTMLで書いていて
<form id="form" METHOD="POST" action="確認画面.aspx">
 :
<input TYPE="text" NAME="NAME"">
 :
としていていまくセッション情報を確認画面に引き継いで
くれてました。

ですが、入力画面で検証コントロールを使って必修入力項目
のチェックを行いたく
<form id="form1" runat="server">
 :
<asp:TextBox ID="NAME" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RFV1" runat="server"_
ErrorMessage="←必ず記入してください" ValidationGroup="GOTO" ControlToValidate="NAME"></asp:RequiredFieldValidator>
 :
といったような形にして
<script runat="server">
Protected Sub btGOTO_Click(ByVal sender As _
Object, ByVal e As System.EventArgs)
Server.Transfer("確認画面.aspx")
End Sub
</script>
としたら、確認画面側に
__EVENTTARGET
__EVENTARGUMENT
__VIEWSTATE
NAME   ←これがTextBox
btGOTO  ←これはボタンボタンコントロール
__EVENTVALIDATION
とシステム内の情報もセッション情報として渡ってしまいました。

私がほしいのはTextBoxに入力した情報だけなんです。
これは、説明用で1項目のコントロールだけしか書きませんでしたが
実際にはいくつものコントロールの情報を次の画面に引き継ぎたいん
です。なので、1つ1つを代入させるのはやりたくないんです。
通常のHTMLでやっているPOSTと同じような動きにはならないものなん
でしょうか?

ちなみに、最初は
Response.Redirect("確認画面.aspx")
としていたのですが、これでは何もセッション情報を渡してく
れませんでした。

どなたかご教授ください。よろしくお願いいたします。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-10-09 13:57
> 通常のHTMLでやっているPOSTと同じような動きにはならないものなんでしょうか?

はい、なりません。

まず、ASP.NETの基本となるPostBackとかその周辺の動作について理解をされることをおすすめします。
ASP.NETがイベントドリブンで開発できるのは、このPostBackやViewStateといった仕組みのおかげなのですが、このせいでCGI等でWebアプリを開発していた人にはむしろわかりにくいものになってしまっています。
ただ、このあたりをきちんとおさえてからでないと、せっかくいろいろと用意されているASP.NETの利点をまったく使わないプログラムを書くようなはめになってしまいます。

あと、
> メール送信させるVBは何とか出来てます。

とのことですが、これはVBで作ったプログラム、ということでしょうか。
この場合、開発サーバ(VSに組み込まれているテストサーバ)で動いている状況ですかね。
開発サーバと実際に利用するであろうIISは実行するユーザの権限等が異なりますので、開発環境で動いたからといって運用するサーバで動くとは思わないほうがいいです。
実環境もしくはそれに近いものでまずテストしてみたほうがいいですよ。

#多分うまく動かないと思います。。。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-10-09 21:50
同じになる、ならないで言えば、同じなんだけど、色々拡張してあります。CGI でやってたのと同じ作り方はできません。

おそらく、リクエストのパラメータを全てセッションに入れているのだと思います。
そうではなく、Controls から探すとかで対応するべきかと思います。

あと、セッションをどこに保存するかも確認しておくほうがいいと思います。


まずは、1.1でいくのか、2.0にするのか、ですかね。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2008-10-10 09:49
ASP.NETで実装する方法は、いろいろありますので紹介しておきます。

ページ遷移時のデータを引き継ぐ第1の方法:クエリ文字列
ページ遷移時のデータを引き継ぐ第2の方法:Sessionオブジェクト
http://www.atmarkit.co.jp/fdotnet/vblab/aspnetforvb04/aspnetforvb04_02.html

クロスページ・ポストバック(2.0)
http://www.atmarkit.co.jp/fdotnet/dotnettips/406asppostback1/asppostback1.html

PlaceHolderコントロールを用いた画面の切り替え
http://www.atmarkit.co.jp/fdotnet/dotnettips/354aspplchldr/aspplchldr.html

MultiView/Viewコントロール(2.0)
http://www.atmarkit.co.jp/fdotnet/dotnettips/399aspmultiview/aspmultiview.html

Wizardコントロール(2.0)
http://www.atmarkit.co.jp/fdotnet/dotnettips/424aspwizard/aspwizard.html
DotNet初心者
会議室デビュー日: 2008/10/09
投稿数: 4
投稿日時: 2008-10-14 14:16
どっとねっとふぁんサン
Jittaサン
todoサン
ありがとうございました。

1)入力画面のコード部に
<%@ Page Language="VB" %>
<script runat="server">
 :
Session("セッション名1") = "セッション名1"
 :
のようにセッションで引き継ぎたい内容を静的に書き込んで
対応するようにしました。

どっとねっとふぁんサン:
−たしかにCGIやPHPはやったことがあるんですがASP.NETだと、おっしゃるように動きが理解しづらいです。
 PostBackやViewStateについて詳しく説明されているURLありおませんか?

−”メール送信させるVBは何とか出来てます。”は適切な説明ではなかったですね。
正確にはWeb.Config(.NET2)で
<httpHandlers>
<add verb="POST" path="Mail.axd" type="MailSend" validate="false"/>
</httpHandlers>
と定義したソースを呼び出してメールしてます。
この部分は.NET1でも動くようにSystem.Web.Mailで書き動作できました。

Jittaサン:
.NET1.1で行くしかないようなんです。
1つ教えていただきたいのが、Buttonが押されたときにHTML内の
"<asp:TextBox "と"<asp:DropDownList"のIDとValue一覧が格納
されるクラスってありませんか?

todoさん:
参考URLありがとうございます。
1つ1つ見てゆきます。

よろしくお願いいたします。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-10-14 14:28
> PostBackやViewStateについて詳しく説明されているURLありおませんか?

@IT内にもいい記事がいくつかあったと思います。
古いものも含めて関係しそうなものにひととおり目を通してみることをおすすめします。

あと、PostBackをうまく使うことを考えたら、私だったらすべての画面を1ファイルの中でまとめてしまって、Panelの表示とかで見た目を切り換えるようにします。
ASP.NETの場合、1つの機能として1ファイル(ページ)みたいな形にしたほうが作りやすいと思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-10-15 20:38
 最初の返答にも書いたように、Page クラス<microsoft.com> には Controls プロパティがあり、サーバー コントロールは全てここに登録されています。ただし、平坦ではないので、使用しているコントロールによっては、再帰的に検査する必要があります。

 ところで、「確認画面」って、本当に必要なのでしょうか。「入力画面」→「確認画面」→「登録しました」→「入力(編集)画面」と遷移するなら、「確認画面」と「登録しました」は不要ではないでしょうか。「入力兼編集画面」があり、ここにメッセージとして「登録しました」が表示されれば、余分な画面がないので、安全性、安定性、生産性が得られるのではないでしょうか。
 もっとも、input 要素には、視認性の問題がありますから、「確認画面」を別ウインドウに表示し、「確認画面」から他の画面には遷移させないという方法もあろうかと思います。ちょうど、画像をクリックすると別画面で画像が大きく表示され、その画面には「閉じる」しかないようなものです。
1

スキルアップ/キャリアアップ(JOB@IT)