質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

2回答

1084閲覧

クライアント側で1回目のJSを上手く動かせる方法を知りたい

kentasuzuki_

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2022/01/20 09:30

編集2022/01/20 09:33

クライアント側で1回目のJSを上手く動かせる方法を教えていただければ幸いです。

クライアントからサーバーへsubmitされた時の処理なのですが、
まずDemandLinkButtonをクリックすると、サーバー側でCustomValidator1_ServerValidateのイベントが走ります。
結果がTrueならScriptを登録して、Confirmメソッドが働くような動きが実現できているのですが、
1回目だけですが、DemandLinkButtonをクリックしてもConfirmメソッドが働かないので、原因が分からなくて困っています。

お手数をおかけしますが、何卒宜しくお願い致します。

.aspx

<asp:Textbox ID="MoneyTextBox" runat="server" /> <asp:LinkButton ID="DemandLinkButton" runat="server" Text="申請" OnClick="DemandLinkButton_Click" /> <div> <asp:CustomValidator ID="CustomValidator1" runat="server" Display="Dynamic" ErrorMessage="" ControlToValidate="MoneyTextBox" OnServerValidate="CustomValidator1_ServerValidate"> </asp:CustomValidator> </div> <script type="text/javascript"> function TotalMoneyCheck() { $('#<%= DemandLinkButton.ClientID %>').click(function (){ return confirm("金額が違いますが、このまま申請してもよろしいですか?"); }); } </script>

.aspx.cs

//クライアントからサーバーへsubmitされた時の処理 protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args) { // テキストボックスへのユーザー入力が 200 以外ならScriptを登録する if (args.Value != "200") { // Scriptを登録し、aspx側に記載しているTotalMoneyCheck()関数を呼ぶ ScriptManager.RegisterStartupScript(this, this.GetType(), "TotalMoney", "TotalMoneyCheck();", true); } else { return; } } 補足ですが、ここではMoneyTextBox.Textの値は100とします。

追加情報(FW/ツールのバージョンなど)

Web Formsを利用し、開発をしています。

【開発環境】
開発環境 VisualStudio2019
言語   C#

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/20 10:00

前のスレッド https://teratail.com/questions/o6s2ehnqbdz60v の続きもしくは関連する話ですよね。質問欄を編集して前のスレッドの url を書いてその話の続きであることを追記してください。
退会済みユーザー

退会済みユーザー

2022/01/20 10:06

前のスレッドで「検証結果 NG の場合でもユーザーが OK すれば受け付けるなどというパターンは絶対にありません。検証結果 NG なら問答無用で受け付けないようにしないとセキュリティが保てませんので。」と言ったけど分かってますか? そこまで言ったのに無視して同じような質問をするとは・・・ 人の話を聞いてますか?
退会済みユーザー

退会済みユーザー

2022/01/20 12:37

前のスレッド https://teratail.com/questions/o6s2ehnqbdz60v の続きもしくは関連する話ですよね。質問欄を編集して前のスレッドの url を書いてその話の続きであることを追記してください・・・ちゃんとやって
退会済みユーザー

退会済みユーザー

2022/01/21 01:45

前のスレッド https://teratail.com/questions/o6s2ehnqbdz60v の続きもしくは関連する話ですよね。質問欄を編集して前のスレッドの url を書いてその話の続きであることを追記してください・・・これで 3 回目
guest

回答2

0

前のスレッド https://teratail.com/questions/o6s2ehnqbdz60v で、

質問者さんのやりたいことは、LinkButton クリックでポストバックされた後サーバー側で DemandLinkButton_Click が動き出してから、その途中で JavaScript の confirm を出して DemandLinkButton_Click 内のコードの処理を止めるということだったようですが、そういうことは不可能です。

と「不可能です」と言ったはず。

それと同じです。ポストバックされてサーバー側で CustomValidator1_ServerValidate が走り出した後、その途中で JavaScript の confirm を出して C# のコードの実行を止めるなんてことは不可能です。

前のスレッドでも言いましたが、そもそも検証結果 NG の場合でもユーザーが OK すれば受け付けるなどというパターンは絶対にありません。検証結果 NG なら問答無用で受け付けないようにしないとセキュリティが保てません。

そこまで言ったのに無視して同じような質問をする。何なのあなたは? 人の話を聞いてますか?

投稿2022/01/20 10:18

編集2022/01/20 10:24
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kentasuzuki_

2022/01/20 11:29

あとちなみにですが、サーバー側で CustomValidator1_ServerValidate が走り出した後、その途中で JavaScript の confirm を出して C# のコードの実行を止めるなんてことは不可能とおっしゃっておられますが、2回目以降の処理ですと、きちんと動くことは確認できています。
退会済みユーザー

退会済みユーザー

2022/01/20 12:38 編集

> サーバー側でうまく処理をする方法があると会社の人から聞いたので、 じゃあ、その「会社の人」とやらに聞いて解決したらいいでしょう。ここで聞く必要があるの? ふざけるなと言いたい。
kentasuzuki_

2022/01/20 13:21

申し訳ございません。 知識・経験ともに不足していますが、そこまでひどいことを言われるとは思っていませんでした。
退会済みユーザー

退会済みユーザー

2022/01/20 13:36

それはこちらのセリフ。先のスレッドの私のレスを無視して同じような質問をして、「サーバー側でうまく処理をする方法があると会社の人から聞いたので、改めて同じような質問をさせていただいた」と言うのは普通に常識的に社会人のマナーとして考えて許される話なんですかね? その「会社の人」とやらに聞いて解決してと言われて当然と思いませんか?
kentasuzuki_

2022/01/20 13:58

お恥ずかしい限りなのですが、その会社の人からは指導されている身ですが、こちらが分からないことを聞いても詳しく教えてもらえないので、teratailさんに質問させていただくしかなかったというのが現状でした。
退会済みユーザー

退会済みユーザー

2022/01/21 01:52

その「会社の人」が指導するのに十分な知識がある人ならば、質問者さんが「会社の人」の意図をくみ取れなくて、意図と違う方向に迷走しているとしか思えません。まず「会社の人」ときちんと話をして、意図を理解して、正しい方向に進むのが筋です。face-to-face で話ができる「会社の人」と話が通じないなら、ここでの文章のやり取りで話が通じるわけなはいと思いませんか?
退会済みユーザー

退会済みユーザー

2022/01/21 02:10 編集

どうしてもここで質問したいなら、質問のコメント欄で依頼した「前スレッドの続きであること」をきちんと書いてください。 そして、どういう理由で前のスレッドでの私のレスを無視してそういうことをしているかの説明を追記してください。 説明と言うのは、例えば、前のスレッドの私の回答の「追記」案に手を加えて confirm が出せないかトライしていることを説明する。期待した動きがどういうものかを詳しく説明する。実際の動きが期待したものとどう違ううかを詳しく説明する。もちろん、ここに書いてあること以外は知り得ない第三者が読んで分かるように言語化してです。
guest

0

$('#<%= DemandLinkButton.ClientID %>') が描画される前に TotalMoneyCheck() が走っちゃってるんじゃないでしょうか。

csharp

1ScriptManager.RegisterStartupScript(this, this.GetType(), "TotalMoney", "$(function() { TotalMoneyCheck(); })", true);

とかだとどうですかね

(RegisterStartupScript で実行する js を $(function(){ }) で囲む)


外してたらごめんなさい。

<asp:CustomValidator /> は使ったことないけど ScriptManager.RegisterStartupScript() は使ってて
そういうケースがあったので... どうかな...

投稿2022/01/20 09:41

sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/20 10:32 編集

ポストバックされてサーバー側で CustomValidator1_ServerValidate が走り出した後、その途中で JavaScript の confirm を出して C# のコードの実行を止めるなんてことは不可能です。
sk_3122

2022/01/21 01:00

あーなるほど、そういうことがしたかったんですね (RegisterStartupScript で実行した js が動かないとかかと思いました) ---- たしかに、サーバー側での処理中に js の confirm を割り込ませるということは出来ません。 もし「何らかのチェックをした結果、confirm で処理を続行するかユーザーに判断させたい」 ということであれば以下ですかね... 1. チェックを JavaScript で行う(submit する前にチェックし、confirm で OK が押されたら submit する) 2. 「サーバー側でチェックをし、結果を返す API」を作成。 非同期でそれを呼び出し、結果に応じて confirm を出す。
sk_3122

2022/01/21 01:10

おそらく質問者さんは、「でも 2 回目では confirm が出るので、サーバー処理の途中で js を差し込むことが出来るのではないか?」と思って その辺が納得できていないのじゃないかなと思います。 流れとしては 1. サーバー側の処理 2. クライアント側の処理(jsが動くのはここ) ここまでで初期の画面表示の動きです。 ここで submit すると、 a. クライアントから、入力値がサーバー側に submit される b. サーバー側の CustomValidator1_ServerValidate が走り、金額が 200 以外であれば 「画面表示時に TotalMoneyCheck() を呼ぶ」というスクリプトを仕込んだ上で 画面が再描画される c. クライアント側の処理 RegisterStartupScript で仕込まれた TotalMoneyCheck() がここで呼ばれ、 「`$('#<%= DemandLinkButton.ClientID %>')` がクリックされたら confirm を出す」 というイベントが仕込まれる この後に `$('#<%= DemandLinkButton.ClientID %>')` を押されると、必ず confirm が出ます。 これは CustomValidator1_ServerValidate の途中に割り込めているわけではなく、 b の時に仕込んだ js が動いているだけです。 2 回目は金額が 200 でも 100 でも必ず confirm が出る、と思います。 繰り返しになりますが、サーバー処理の途中で js を割り込ませることはできません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問