クライアント側で確認ダイアログのキャンセルを押下した際にサーバーサイド側の処理を止めたい
そういう場合の ASP.NET Web Froms アプリの定番のやり方は Button とか LinkButton に備わっている OnClientClick プロパティを使うことです。
LinkButton の場合の具体例は以下の通りで、OnClientClick プロパティに JavaScript のコード、今回の例では return confirm("xxx"); を設定します。
<asp:LinkButton ID="LinkButton1" runat="server"
OnClick="LinkButton1_Click"
OnClientClick="return confirm("金額が違いますが、このまま申請してもよろしいですか?");">
LinkButton
</asp:LinkButton>
上のコードが ASP.NET によって html に変換されると以下のように a 要素になります。
<a onclick="return confirm("金額が違いますが、このまま申請してもよろしいですか?");"
id="LinkButton1"
href="javascript:__doPostBack('LinkButton1','')">
LinkButton
</a>
サーバー側で OnClientClick プロパティに設定した JavaScript のコードは a 要素の onclick 属性に設定されています。これにより、LinkButton クリックでまず confirm ダイアログが表示されます。その[キャンセル]ボタンをクリックすると false が返ってくるのでそこでそれ以降の操作はキャンセルされます。
ダイアログの[OK]をクリックすると true が返ってくるので操作は続行され、href 属性に設定したスクリプトによりポストバックされます。結果、サーバー側で LinkButton1_Click メソッドが動きます。
追記
下の 2022/01/19 15:42 の私のコメントで、
「ユーザー入力の検証のやり方は決まっています。それ用に ASP.NET Web Forms アプリには数々の検証コントロールがあるので、それらを使うことを考えましょう」と書きましたが、後でそのやり方を回答欄に追記しておきます。
・・・と書いた件です。
質問者さんのやりたいことは、LinkButton クリックでポストバックされた後サーバー側で DemandLinkButton_Click が動き出してから、その途中で JavaScript の confirm を出して DemandLinkButton_Click 内のコードの処理を止めるということだったようですが、そういうことは不可能です。
ASP.NET の普通のユーザー入力の検証パターンは、入力画面のテキストボックスなどにユーザーが入力した値を検証して、検証結果が OK ならサーバー側で必要な処理をしてからリダイレクト、NG なら再度入力画面に戻ってエラーメッセージを表示しユーザーに再入力を促すというものです。
検証結果 NG の場合でもユーザーが OK すれば受け付けるなどというパターンは絶対にありません。検証結果 NG なら問答無用で受け付けないようにしないとセキュリティが保てませんので。
ASP.NET Web Forms アプリには数々の検証コントロールがありますが、それらの内 RequiredFieldValidator と CustomValidator を使ったサンプルを以下の紹介しておきます。
.aspx
TextBox1 へのユーザー入力を RequiredFieldValidator と CustomValidator で検証します。前者は未入力をチェック、後者は入力が 200 か否かをチェックします。
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="WebForm2.aspx.cs" Inherits="WebForms1.WebForm2" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
runat="server"
Display="Dynamic" ForeColor="Red"
ErrorMessage="必須入力です"
ControlToValidate="TextBox1">
</asp:RequiredFieldValidator>
<asp:CustomValidator ID="CustomValidator1" runat="server"
Display="Dynamic" ForeColor="Red"
ErrorMessage="金額が違います"
ControlToValidate="TextBox1"
OnServerValidate="CustomValidator1_ServerValidate">
</asp:CustomValidator>
<br />
<asp:LinkButton ID="LinkButton1" runat="server"
OnClick="LinkButton1_Click" >
申請
</asp:LinkButton>
</div>
</form>
</body>
</html>
.aspx.cs
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebForms1
{
public partial class WebForm2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
// CustomeValidator によるサーバー側での検証
protected void CustomValidator1_ServerValidate(object source,
ServerValidateEventArgs args)
{
// 「RecalcMoney()の戻り値は200とします」とのことなので
// テキストボックスへのユーザー入力が 200 なら検証 OK
if (args.Value == "200")
{
args.IsValid = true;
}
else
{
args.IsValid = false;
}
}
protected void LinkButton1_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
// Page.IsValid が true なら検証結果 OK
// 要求を受け付けて必要なサーバー側での処理を行う
// その後リダイレクト(Post-Redirect-Get パターン)
Response.Redirect("Default.aspx");
}
// 検証結果 NG の場合は元の入力画面が再描画され、その際
// 検証コントロールに設定したエラーメッセージが表示される
}
}
}
実行結果は、テキストボックス未入力なら RequiredFieldValidator が働いて、

200 以外の入力なら CustomValidator が働いて、

となります。200 なら検証結果 OK となって Deafult.aspx にリダイレクトされます。