\n\n\n\n\n```\n\n.aspx.cs\n```ここに言語を入力\n//クライアントからサーバーへsubmitされた時の処理\n protected void CustomValidator1_ServerValidate(object source, \n ServerValidateEventArgs args)\n {\n // テキストボックスへのユーザー入力が 200 以外ならScriptを登録する\n if (args.Value != \"200\")\n { \n // Scriptを登録し、aspx側に記載しているTotalMoneyCheck()関数を呼ぶ\n ScriptManager.RegisterStartupScript(this, this.GetType(), \"TotalMoney\", \"TotalMoneyCheck();\", true);\n }\n else \n { \n return;\n }\n }\n\n補足ですが、ここではMoneyTextBox.Textの値は100とします。\n\n```\n\n### 追加情報(FW/ツールのバージョンなど)\nWeb Formsを利用し、開発をしています。\n\n\n【開発環境】\n開発環境 VisualStudio2019\n言語 C#","answerCount":2,"upvoteCount":0,"datePublished":"2022-01-20T09:30:40.310Z","dateModified":"2022-01-21T11:10:48.000Z","suggestedAnswer":[{"@type":"Answer","text":"前のスレッド https://teratail.com/questions/o6s2ehnqbdz60v で、\n\n> 質問者さんのやりたいことは、LinkButton クリックでポストバックされた後サーバー側で DemandLinkButton_Click が動き出してから、その途中で JavaScript の confirm を出して DemandLinkButton_Click 内のコードの処理を止めるということだったようですが、そういうことは不可能です。\n\nと「**不可能です**」と言ったはず。\n\nそれと同じです。ポストバックされてサーバー側で CustomValidator1_ServerValidate が走り出した後、その途中で JavaScript の confirm を出して C# のコードの実行を止めるなんてことは不可能です。\n\n前のスレッドでも言いましたが、そもそも検証結果 NG の場合でもユーザーが OK すれば受け付けるなどというパターンは絶対にありません。検証結果 NG なら問答無用で受け付けないようにしないとセキュリティが保てません。\n\nそこまで言ったのに無視して同じような質問をする。何なのあなたは? 人の話を聞いてますか?","dateModified":"2022-01-20T10:24:20.932Z","datePublished":"2022-01-20T10:18:51.873Z","upvoteCount":0,"url":"https://teratail.com/questions/0yisrjmuqd01nv#reply-rantnd9pyqyjwq","comment":[{"@type":"Comment","text":"失礼いたしました。\nhttps://teratail.com/questions/o6s2ehnqbdz60vに関連した話だったのですが、\nサーバー側でうまく処理をする方法があると会社の人から聞いたので、改めて同じような質問をさせていただいたのですが、やはり不可能なのですね。\n申し訳ございませんでした。","datePublished":"2022-01-20T11:27:00.716Z","dateModified":"2022-01-20T11:27:00.716Z"},{"@type":"Comment","text":"あとちなみにですが、サーバー側で CustomValidator1_ServerValidate が走り出した後、その途中で JavaScript の confirm を出して C# のコードの実行を止めるなんてことは不可能とおっしゃっておられますが、2回目以降の処理ですと、きちんと動くことは確認できています。","datePublished":"2022-01-20T11:29:21.505Z","dateModified":"2022-01-20T11:29:21.505Z"},{"@type":"Comment","text":"> サーバー側でうまく処理をする方法があると会社の人から聞いたので、\n\nじゃあ、その「会社の人」とやらに聞いて解決したらいいでしょう。ここで聞く必要があるの? ふざけるなと言いたい。","datePublished":"2022-01-20T12:33:38.735Z","dateModified":"2022-01-20T12:38:09.907Z"},{"@type":"Comment","text":"申し訳ございません。\n知識・経験ともに不足していますが、そこまでひどいことを言われるとは思っていませんでした。","datePublished":"2022-01-20T13:21:13.034Z","dateModified":"2022-01-20T13:21:13.034Z"},{"@type":"Comment","text":"それはこちらのセリフ。先のスレッドの私のレスを無視して同じような質問をして、「サーバー側でうまく処理をする方法があると会社の人から聞いたので、改めて同じような質問をさせていただいた」と言うのは普通に常識的に社会人のマナーとして考えて許される話なんですかね? その「会社の人」とやらに聞いて解決してと言われて当然と思いませんか?","datePublished":"2022-01-20T13:36:10.049Z","dateModified":"2022-01-20T13:36:10.049Z"},{"@type":"Comment","text":"お恥ずかしい限りなのですが、その会社の人からは指導されている身ですが、こちらが分からないことを聞いても詳しく教えてもらえないので、teratailさんに質問させていただくしかなかったというのが現状でした。","datePublished":"2022-01-20T13:58:54.323Z","dateModified":"2022-01-20T13:58:54.323Z"},{"@type":"Comment","text":"その「会社の人」が指導するのに十分な知識がある人ならば、質問者さんが「会社の人」の意図をくみ取れなくて、意図と違う方向に迷走しているとしか思えません。まず「会社の人」ときちんと話をして、意図を理解して、正しい方向に進むのが筋です。face-to-face で話ができる「会社の人」と話が通じないなら、ここでの文章のやり取りで話が通じるわけなはいと思いませんか?\n","datePublished":"2022-01-21T01:52:57.096Z","dateModified":"2022-01-21T01:52:57.096Z"},{"@type":"Comment","text":"どうしてもここで質問したいなら、質問のコメント欄で依頼した「前スレッドの続きであること」をきちんと書いてください。\n\nそして、どういう理由で前のスレッドでの私のレスを無視してそういうことをしているかの説明を追記してください。\n\n説明と言うのは、例えば、前のスレッドの私の回答の「追記」案に手を加えて confirm が出せないかトライしていることを説明する。期待した動きがどういうものかを詳しく説明する。実際の動きが期待したものとどう違ううかを詳しく説明する。もちろん、ここに書いてあること以外は知り得ない第三者が読んで分かるように言語化してです。","datePublished":"2022-01-21T02:03:43.300Z","dateModified":"2022-01-21T02:10:48.139Z"}]},{"@type":"Answer","text":"`$('#<%= DemandLinkButton.ClientID %>')` が描画される前に `TotalMoneyCheck()` が走っちゃってるんじゃないでしょうか。\n\n\n```csharp\nScriptManager.RegisterStartupScript(this, this.GetType(), \"TotalMoney\", \"$(function() { TotalMoneyCheck(); })\", true);\n```\n\nとかだとどうですかね\n\n\n(RegisterStartupScript で実行する js を `$(function(){ })` で囲む)\n\n----\n\n外してたらごめんなさい。\n\n` ` は使ったことないけど `ScriptManager.RegisterStartupScript()` は使ってて\nそういうケースがあったので... どうかな...","dateModified":"2022-01-20T09:41:45.405Z","datePublished":"2022-01-20T09:41:45.405Z","upvoteCount":0,"url":"https://teratail.com/questions/0yisrjmuqd01nv#reply-fseyvyx3kmo00h","comment":[{"@type":"Comment","text":"ポストバックされてサーバー側で CustomValidator1_ServerValidate が走り出した後、その途中で JavaScript の confirm を出して C# のコードの実行を止めるなんてことは不可能です。","datePublished":"2022-01-20T10:20:01.106Z","dateModified":"2022-01-20T10:32:40.400Z"},{"@type":"Comment","text":"あーなるほど、そういうことがしたかったんですね\n(RegisterStartupScript で実行した js が動かないとかかと思いました)\n\n----\n\nたしかに、サーバー側での処理中に js の confirm を割り込ませるということは出来ません。\n\nもし「何らかのチェックをした結果、confirm で処理を続行するかユーザーに判断させたい」\nということであれば以下ですかね...\n\n\n1. チェックを JavaScript で行う(submit する前にチェックし、confirm で OK が押されたら submit する)\n\n2. 「サーバー側でチェックをし、結果を返す API」を作成。\n 非同期でそれを呼び出し、結果に応じて confirm を出す。","datePublished":"2022-01-21T01:00:24.770Z","dateModified":"2022-01-21T01:00:24.770Z"},{"@type":"Comment","text":"おそらく質問者さんは、「でも 2 回目では confirm が出るので、サーバー処理の途中で js を差し込むことが出来るのではないか?」と思って\nその辺が納得できていないのじゃないかなと思います。\n\n\n流れとしては\n 1. サーバー側の処理\n 2. クライアント側の処理(jsが動くのはここ)\nここまでで初期の画面表示の動きです。\n\n\nここで submit すると、\n\n a. クライアントから、入力値がサーバー側に submit される\n\n b. サーバー側の CustomValidator1_ServerValidate が走り、金額が 200 以外であれば\n 「画面表示時に TotalMoneyCheck() を呼ぶ」というスクリプトを仕込んだ上で\n 画面が再描画される\n\n c. クライアント側の処理\n RegisterStartupScript で仕込まれた TotalMoneyCheck() がここで呼ばれ、\n 「`$('#<%= DemandLinkButton.ClientID %>')` がクリックされたら confirm を出す」\n というイベントが仕込まれる\n\nこの後に `$('#<%= DemandLinkButton.ClientID %>')` を押されると、必ず confirm が出ます。\n\nこれは CustomValidator1_ServerValidate の途中に割り込めているわけではなく、\nb の時に仕込んだ js が動いているだけです。\n2 回目は金額が 200 でも 100 でも必ず confirm が出る、と思います。\n\n繰り返しになりますが、サーバー処理の途中で js を割り込ませることはできません。","datePublished":"2022-01-21T01:10:38.502Z","dateModified":"2022-01-21T01:10:38.502Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"トップ","url":"https://teratail.com"},{"@type":"ListItem","position":2,"name":"C#に関する質問","url":"https://teratail.com/tags/C%23"},{"@type":"ListItem","position":3,"name":"C#","url":"https://teratail.com/tags/C%23"}]}}}
クライアント側で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#
前のスレッド https://teratail.com/questions/o6s2ehnqbdz60v で、
質問者さんのやりたいことは、LinkButton クリックでポストバックされた後サーバー側で DemandLinkButton_Click が動き出してから、その途中で JavaScript の confirm を出して DemandLinkButton_Click 内のコードの処理を止めるということだったようですが、そういうことは不可能です。
と「不可能です 」と言ったはず。
それと同じです。ポストバックされてサーバー側で CustomValidator1_ServerValidate が走り出した後、その途中で JavaScript の confirm を出して C# のコードの実行を止めるなんてことは不可能です。
前のスレッドでも言いましたが、そもそも検証結果 NG の場合でもユーザーが OK すれば受け付けるなどというパターンは絶対にありません。検証結果 NG なら問答無用で受け付けないようにしないとセキュリティが保てません。
そこまで言ったのに無視して同じような質問をする。何なのあなたは? 人の話を聞いてますか?
$('#<%= DemandLinkButton.ClientID %>') が描画される前に TotalMoneyCheck() が走っちゃってるんじゃないでしょうか。
csharp
1 ScriptManager . RegisterStartupScript ( this , this . GetType ( ) , "TotalMoney" , "$(function() { TotalMoneyCheck(); })" , true ) ;
とかだとどうですかね
(RegisterStartupScript で実行する js を $(function(){ }) で囲む)
外してたらごめんなさい。
<asp:CustomValidator /> は使ったことないけど ScriptManager.RegisterStartupScript() は使ってて
そういうケースがあったので... どうかな...
15分調べてもわからないことは teratailで質問しよう!
ただいまの回答率 85.29%
質問をまとめることで 思考を整理して素早く解決
テンプレート機能で 簡単に質問をまとめる
質問する