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

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

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

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

ASP.NET

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

Q&A

解決済

1回答

5898閲覧

ASP.NET 検証コントロールをサーバー側で動かしたい

pinamon

総合スコア7

C#

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

ASP.NET

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

0グッド

0クリップ

投稿2020/06/17 17:11

編集2020/06/17 23:28

前提・実現したいこと

ASP.NETを使用してホテルの予約フォームのようなものを作成中です。予約に必要な名前、年齢、性別その他を入力する際に検証コントロールを使用して、入力内容をチェックできるようにしたいと思っています。
各入力項目を入力後、「お申し込み」ボタンを押下することで入力内容を検証し、入力内容が正しければForm2に画面が遷移します。
現在、検証結果のエラーメッセージが画面に出力されずに、「お申し込み」ボタンを押下すると画面が遷移してしまいます。検証コントロールが思うように動いていないと判断しているのですが、この原因が知りたいです。

該当のソースコード

<html xmlns="***"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <style type="text/css"> dl{padding:0; border:1px solid #eee; border-top: none; background-color: #f0f0f0;} dt{float:left; padding:0.1em 0 0.1em 1em; border-top: 1px solid #eee; width: 8em;} dd{margin:0 0 0 10em; padding:0.3em 1em; border-top:1px solid #eee; background-color: #fff;} .valid {color:red;} </style> </head> <body> <form id="form1" runat="server"> <div> ASP.NET Do-It-Yourself 予約フォーム</div> <hr/> <asp:ValidationSummary ID="ValidationSummary1" runat="server" CssClass="valid" /> <dl> <dt>お名前:</dt> <dd><asp:TextBox ID="txtName" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtName" ErrorMessage="お名前を入力してください" CssClass="valid" EnableClientScript="False"></asp:RequiredFieldValidator> </dd> <dt>年齢:</dt> <dd><asp:TextBox ID="txtAge" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="txtAge" Display="Dynamic" ErrorMessage="年齢を入力してください" CssClass="valid" EnableClientScript="False"></asp:RequiredFieldValidator> <asp:RangeValidator ID="RangeValidator1" runat="server" ControlToValidate="txtAge" ErrorMessage="年齢範囲を超えています" MaximumValue="100" MinimumValue="20" Type="Integer" CssClass="valid" EnableClientScript="False"></asp:RangeValidator> </dd> <dt>性別:</dt> <dd><asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" Height="25px"> <asp:ListItem Value="1">男性</asp:ListItem> <asp:ListItem Value="2">女性</asp:ListItem> </asp:DropDownList>&nbsp;</dd> <dt>メールアドレス:</dt> <dd><asp:TextBox ID="txtMailAdrs" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtMailAdrs" Display="Dynamic" ErrorMessage="メールアドレスを入力してください" CssClass="valid" EnableClientScript="False"></asp:RequiredFieldValidator>  <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="txtMailAdrs" ErrorMessage="正しいメールアドレスを入力してください" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*" CssClass="valid" EnableClientScript="False"></asp:RegularExpressionValidator> </dd> <dt>お部屋タイプ:</dt> <dd><asp:RadioButton ID="RadioButton1" runat="server" GroupName="room" Text="シングル" /> &nbsp;<asp:RadioButton ID="RadioButton2" runat="server" GroupName="room" Text="ダブル" /> &nbsp;<asp:RadioButton ID="RadioButton3" runat="server" GroupName="room" Text="ツイン" />&nbsp;<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="選択できない部屋です" OnServerValidate="CustomValidator1_ServerValidate" CssClass="valid"></asp:CustomValidator> </dd> <dt>日付:</dt> <dd><asp:TextBox ID="txtDate" runat="server"></asp:TextBox>&nbsp;<asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server" ControlToValidate="txtDate" Display="Dynamic" ErrorMessage="日付を入力してください" CssClass="valid" EnableClientScript="False"></asp:RequiredFieldValidator> <asp:CompareValidator ID="CompareValidator1" runat="server" ErrorMessage="6月18日以降を指定してください" Operator="GreaterThanEqual" Type="Date" ValueToCompare="2020/06/18" ControlToValidate="txtDate" CssClass="valid" EnableClientScript="False"></asp:CompareValidator> </dd> <dt>備考:</dt> <dd><asp:TextBox ID="TextBox5" runat="server" TextMode="MultiLine" Width="367px"></asp:TextBox></dd> <dt></dt> <dd><asp:Button ID="Button1" runat="server" Text="クリア" OnClick="Button1_Click" />&nbsp;&nbsp; <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="お申し込み" /> </dd> </dl> </form> </body> </html> ---WebForm1 コード--- using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ****** { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { RadioButton1.Checked = true; } } protected void Button1_Click(object sender, EventArgs e) { txtName.Text = ""; txtAge.Text = ""; DropDownList1.SelectedIndex = 0; txtMailAdrs.Text = ""; RadioButton1.Checked = true; txtDate.Text = ""; TextBox5.Text = ""; } protected void Button2_Click(object sender, EventArgs e) { Session["Name"] = txtName.Text; //名前 Session["Age"] = txtAge.Text; //年齢 Session["Gender"] = DropDownList1.SelectedValue; //性別 Session["Mail"] = txtMailAdrs.Text; //メールアドレス string roomType = ""; if (RadioButton1.Checked) { roomType = "シングル"; } else if (RadioButton2.Checked) { roomType = "ダブル"; } else if (RadioButton3.Checked) { roomType = "ツイン"; } Session["Room"] = roomType; Session["Date"] = txtDate.Text; //日付 Session["Remark"] = TextBox5.Text; //備考 Response.Redirect("WebForm2.aspx"); } protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args) { if (RadioButton2.Checked) //DropDownList1.SelectedIndex == 0 && { args.IsValid = false; } else { args.IsValid = true; } } } } ---WebForm2 コード--- using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace 課題7_検証コントロール { public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Label1.Text = Session["name"].ToString(); Label2.Text = Session["age"].ToString(); Label3.Text = (Session["gender"].ToString() == "1") ? "男性" : "女性"; Label4.Text = Session["mail"].ToString(); Label5.Text = Session["room"].ToString(); Label6.Text = Session["Date"].ToString(); Label7.Text = Session["remark"].ToString(); } } }

試したこと

検証コントロールを配置し(CompareValidator、CustomValidator、RangeValidator、RegularExpressionValidator、RequiredFieldValidator)、それぞれEnableClientScriptプロパティをtrueにした状態で実行したところCustomValidatorのみ動きませんでした。
調べたところ、CustomValidatorはサーバー側で検証を行っているため、その他の検証コントロールもサーバー側で検証を行うようにEnableClientScriptプロパティをfalseにすればよいとの記述を見つけました。その通りにしてみましたが、今度はすべての検証コントロールが機能していないように見えます。検証結果のメッセージが出なくなってしまいました。

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

SQLserver ASP.NET、C#、Visual Studio2019(16.6.2)、.NET Framework(4.8)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/17 21:38

そもそも検証コントロールは何もしなくてもサーバー側で動くようにできています。どこを見てどう判断して動かないと言っていますか?
退会済みユーザー

退会済みユーザー

2020/06/17 21:49

先のスレッドの私の回答の「追記」に書いた ScriptManager の件、ちゃんと対応してますか? このスレッドの問題と関係あるかどうか分かりませんが、もし未対応であれば、余計なことは考えなくて済むようそう言う問題は一切排除してください。
pinamon

2020/06/17 23:00

クライアント側で検証する検証コントロールと、サーバー側で検証するCustomValidatorを設置すると、CustomValidatorが動かない(エラーメッセージが出ない)とテキストに書いてありました。これを解消するためには、どちらもクライアント側で動くようにするか、サーバー側で動くようにしましょうとも… わたしが動かないと判断したのは、「お申し込み」ボタンを押下したとき、どの検証コントロールもエラーメッセージを出さずに次のフォームに画面が遷移してしまったことが理由です。 記載いただいていたURL先は拝見し、Webフォームのテンプレートから作成しています。
退会済みユーザー

退会済みユーザー

2020/06/17 23:06

ボタンクリックで「画面が遷移」とのことですが、と言うことはそのイベントハンドラで何かしてますよね? 情報は小出しにしないで最初から質問に書いていただくようお願いします。イベントハンドラのコードを質問欄に追記してください。
pinamon

2020/06/17 23:28

申し訳ありません。記載いたしました。
guest

回答1

0

ベストアンサー

先のスレッドでも書きましたが、ASP.NET Web Forms アプリに標準で用意されている検証コントロールを使えば、クライアント側での JavaScript / jQuery による検証と、サーバー側での検証の両方が有効になります。

CustomValidator については検証用のコードを自力で書いて実装しますが、質問者さんの場合は CustomValidator1_ServerValidate メソッドでサーバー側のコードは実装しているものの、クライアント側の JavaScript の検証コードは実装してないので(ですよね?)、クライアント側での検証はかかりません。

CustomValidator と他の検証コントロールとは動きが違ったのはそういう理由です。

クライアント側での検証はデフォルトで有効になっており、クライアント側での検証結果が NG の場合はボタンをクリックしてもポストバックはキャンセルされるのでサーバー側のコードには制御は飛ばず、当然サーバー側での検証はかかりません。(エラーメッセージは JavaScript / jQuery により表示されますが)

クライアント側での検証を無効にする(EnableClientScript プロパティを false に設定する)とボタンクリックでポストバックされ、Button2_Click メソッドに制御が飛びます。

回答のコメントに書きましたが、そもそも検証コントロールは何もしなくてもサーバー側で動くようにできていますので、そこまではサーバー側での検証はかかっています。

ちょっと前置きが長くなりましたが、ここまでのところが理解できていないとこの先の説明も分からないと思いますので、上記を読んで理解してください。

で、本題の、

現在、検証結果のエラーメッセージが画面に出力されずに、「お申し込み」ボタンを押下すると画面が遷移してしまいます。検証コントロールが思うように動いていないと判断しているのですが、この原因が知りたいです。

に対する答えですが・・・

エラーメッセージは元の画面 WebForm1 でしか表示できません。なので検証結果が NG となって、そのエラーメッセージを表示するためには元の画面 WebForm1 を再描画する必要があります。

「お申し込み」ボタンのクリックのハンドラ Button2_Click で無条件に Response.Redirect("WebForm2.aspx"); として WebForm2 にリダイレクトしてしまったのでは、当然ながらエラーメッセージは表示できません。

なので、ハンドラ Button2_Click の一番最初の行あたりで Page.IsValid プロパティを使って検証結果が NG なら何もしないで return してみてください。元の画面 WebForm1 が再描画されてエラーメッセージが表示されると思います。

今回の話と直接関係ないことですが、RequiredFieldValidator 以外では、未入力に対する検証結果は OK 扱いになるので注意してください。これを知らないと次にまたハマると思います。

投稿2020/06/18 00:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pinamon

2020/06/18 02:27

望んでいた結果です。 検証コントロールは正常に動いていたのですね。 まだまだ勉強が足りないと日々思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問