- PR -

ターゲット指定の値渡し

投稿者投稿内容
BB.NK
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 138
投稿日時: 2004-03-03 15:11
お世話様です。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9629&forum=7
にて、教えていただいたRegisterStartUpScriptメソッドについてお聞き致します。
ヘルプを見てたのですが、正直使い方がわかりません。
やりたいことは、検索機能をもつページで検索件数が複数の場合はグリッド表示、
一件の場合はそのデータのIDをJavaScriptにてtargetを指定してsubmitする方法です。
スクリプトの中身は、
function send_id(ID)
{
  document.form1.target = "test";
  document.form1.id_text.value = ID;
  document.form1.action = "test.aspx";
  document.form1.submit();
}
です。(JavaScriptを使わなくてもtarget指定で値を送信できればよいのですが。。。)
ここでRegisterStartUpScriptを使う場合、
コード:
string strScript = "<script language="javascript" function{・・・↑に書いた関数}</script>";
RegisterStartupScript("Startup", strScript);


のように記述すればよろしいのでしょうか?
因みに、一つ目の引数の意味がよくわかりません。

意味不明でしたら、追記しますのでご教授お願い致します。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-03 15:33
どのような動きになるかは出力されたHTMLのソースをみてみればわかりやすいです。
一つ目の引数は登録したスクリプトを区別するための名前ですが
実際その名前で区別して何かするということは少ないと思います。

(追加)
↓この部分は間違いですね。失礼

ちなみにJavaScriptを使わない場合は↓のような感じ
(いろいろ抜けていますので補完してください)

コード:

ButtonClick()
{
// データを読み込む
sqlAdapter.Fill( ds );

// 検索結果が1件の場合
if( ds.table1.rows.count == 1 ){
// IDを付加して別ページを呼び出す
url = "test.aspx?ID=" + ds.table.rows[0]["ID"].ToStrig();
Response.Redirect( url, true );
}
else {
// データグリッドにデータバインド
dataGrid.DataBind();
}

}



[ メッセージ編集済み 編集者: ゆうじゅん 編集日時 2004-03-03 15:37 ]
BB.NK
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 138
投稿日時: 2004-03-03 16:09
お返事ありがとうございます。

Response.Redirectというのはtargetを指定できているのでしょうか?

引き続きお願い致します。

[ メッセージ編集済み 編集者: BB.NK 編集日時 2004-03-03 16:37 ]
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2004-03-03 16:27
targetは、クライアントからサーバへrequestを送信する際に指定するものです。
サーバからクライアントにresponseを返すときには指定できません。

サーバでの処理結果によって、targetの値を指定することはできないと思います。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-03 16:44
Response.Redirectの件はHeさんの書き込み通りtarget指定では使えません。
ターゲット指定前提ってことを見ないで例を書いてしまって申し訳ありません。
あの例は同一ページで画面遷移させる場合のみ有効です。

ターゲット指定する場合はクライアント側の処理なのでやはりRegisterStartUpScript
を使用するのが一番だと思います。

コード:
・aspxのbodyタグのonloadに以下の記述を追加します。
<body onload="if (typeof(send_id) == 'function') send_id();" MS_POSITIONING="GridLayout">

・検索結果が1件の場合のみRegisterStartUpScriptで関数を登録します。

・ページが読み込まれた際、関数が登録されている場合のみ登録されたjavaスプリクトの関数が動作します


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-04 08:43
引用:

ゆうじゅんさんの書き込み (2004-03-03 15:33) より:

一つ目の引数は登録したスクリプトを区別するための名前ですが
実際その名前で区別して何かするということは少ないと思います。


 スクリプトを区別するというか、スクリプトに名前を付けて、同じ名前のスクリプトの登録は1回だけにする、というか。。。

 例えば、私はテキストボックスをクリックするとカレンダーを別ウインドウで表示するというWebカスタムコンポーネントを作りました。サーバサイドで、テキストボックスのonclick属性にスクリプト関数のコールをさせています。カレンダーを表示させるスクリプトは.ascxファイルに書き込んでも良いのですが、そうすると1つのページに複数のコンポーネントを置かれると、関数名がダブってしまいます。そのため、サーバサイドでRegisterClientScriptBlock(RegisterStartupScriptと、登録される場所が違うだけのメソッド)を利用して、スクリプトを登録しています。こうすることで、1ページには必ずスクリプト関数が1つしか置かれません。


 Aという動作をするスクリプトと、Bという動作をするスクリプトを、同じ名前で登録しようとすると、先に登録したものが有効になります。この点は注意。


引用:

ゆうじゅんさんの書き込み (2004-03-04 10:01) より:

同じ名前で登録すると先に登録したほうが有効になるのですね。てっきり上書きされると
思っていました。


う!記憶が危うい・・・

1.2つのスクリプトを登録して、片方しか登録されておらず、
 原因を調べると同じ名前で登録していた。
2.2つのスクリプトを登録して、片方しか実行されておらず、
 登録する順番を変えて両方が実行されるようにした。

という2ケースがあったのだが、混ざっている。。。
→→確認しました。先に登録したものが有効。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-03-04 12:18 ]
BB.NK
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 138
投稿日時: 2004-03-04 09:09
仕様変更になり、Response.Redirectでもよくなってしまったのですが(つまりtargetの指定なし)少し気になる部分があるため質問させてください。
以下のコードのようにtryの中でDB接続やグリッドへのバインド、一件の場合のResponse.Redirectを行っています。ブレイクポイントを入れて動きを見たところ、Response.Redirectでエラーかなにかが発生してCatchへ飛んでしまいます。
そこで、try-catchをコメントアウトしてみたのですが何も起こらず正常動作します。
これは問題ないのでしょうか?
[code]
using(OracleConnection cnn = new OracleConnection(dsn))
{
 try
 {
  //省略(データセットDSを作成,変数strIDに値を入力)
  if(DS.Tables.Count == 1)
  {
   string strURL = "TEST.aspx?ID=" + strID;
   Response.Redirect(strURL,true);
   return;
  }
  //省略(グリッドへバインド)
  catch
  {
   false_label.Text = "catch DBconnect";
  }
  return;
}

また、target指定の方法も勉強のためやってみます。
わからなかった場合、また質問させてください。

#編集です。
上記の質問ですが、
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9158&forum=7
にも書いてありました。こういったコードはあまりしないということなのでしょうか?
その場合、どうやってコーディングしたらよいでしょうか?

[ メッセージ編集済み 編集者: BB.NK 編集日時 2004-03-04 09:13 ]

[ メッセージ編集済み 編集者: BB.NK 編集日時 2004-03-04 09:16 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-03-04 09:50
引用:

BB.NKさんの書き込み (2004-03-04 09:09) より:
Response.Redirectでエラーかなにかが発生してCatchへ飛んでしまいます。



エラーかなにかではなくて、投げられた例外やメッセージを書いて欲しいところですが、ThreadAbortExceptionではないですか?
これはRedirectなどをすると発生します。
Redirectすることによって、もうそのページの処理は終了するから例外を発生させて処理から抜けてしまうということですかね。

catchしても正しく動いているみたいですが、もしかするとそのまま外まで投げた方がよいかも。

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