前提・実現したいこと
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> </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="シングル" /> <asp:RadioButton ID="RadioButton2" runat="server" GroupName="room" Text="ダブル" /> <asp:RadioButton ID="RadioButton3" runat="server" GroupName="room" Text="ツイン" /> <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> <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" /> <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)
回答1件
あなたの回答
tips
プレビュー