年月日ばらばらのテキストボックス
年・月・日がばらばらのテキストボックスの、検証についてなど
基本的な方針は、年・月・日の入力内容を結合するテキストボックスを作り
その内容をCustomValidatorで検証する感じ。
.aspx側
<div> <asp:TextBox ID="TxtYear" runat="server" Width="60" class="DateTextBox" value=""></asp:TextBox>年 <asp:TextBox ID="TxtMonth" runat="server" Width="60" class="DateTextBox" value=""></asp:TextBox>月 <asp:TextBox ID="TxtDay" runat="server" Width="60" class="DateTextBox" value=""></asp:TextBox>日 <!-- 検証用のテキストボックス(年/月/日を結合する) --> <asp:TextBox ID="TxtDate" runat="server"></asp:TextBox> <asp:Button ID="SendButton" runat="server" Text="検証" ValidationGroup="DateValidator" onclick="SendButton_Click" /> <!-- --> <asp:CustomValidator ID="DateValidator" runat="server" ErrorMessage="正しい日付を入力して下さい。" ValidationGroup="DateValidator" ControlToValidate="TxtDate" onservervalidate="DateValidator_ServerValidate"></asp:CustomValidator> <script type="text/javascript"> $(function () { //タグのVisible="false"で非表示にすると、 //HTML出力時タグごと無くなるので、検証が失敗する。 $("#<%= TxtDate.ClientID %>").hide(); //「YYYY/MM/DD」形式に結合してDateTextBoxにセット $(".DateTextBox").change(function () { yearValue = $("#<%= TxtYear.ClientID %>").val(); monthValue = $("#<%= TxtMonth.ClientID %>").val(); dayValue = $("#<%= TxtDay.ClientID %>").val(); $("#<%= TxtDate.ClientID %>").val(yearValue + "/" + monthValue + "/" + dayValue); }); }); </script> </div>
.aspx.cs側
protected void DateValidator_ServerValidate(object source, ServerValidateEventArgs args) { DateTime dt; args.IsValid = (DateTime.TryParse(args.Value, out dt) ? true : false); } protected void Button2_Click(object sender, EventArgs e) { if (Page.IsValid) { //検証成功時の処理 foo(); } }
[IsValidプロパティについて]
検証コントロールを使用する場合、IsValidプロパティを使用して検証の成否を判定する必要がある。
※検証コントロールはあくまで、検証エラー時にエラーメッセージを表示するだけである。クライアントサイドで検証を行っている場合は必要ないが、基本的にはすべて検証の処理で成否判定を行うべきである。
【追記】
ユーザコントロール化して汎用的に使うなら、以下のようにValidatorGroup
をプロパティにして、呼び出し側からセットしてやればよい。
ascx.cs側
public partial class DateTextBox : System.Web.UI.UserControl { public string validtorGroup { set { DateValidator.ValidationGroup = value; } get { return DateValidator.ValidationGroup ; } } ~以下省略~
aspx.cs側
public partial class ValidTest : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { DateTextBox1.validtorGroup = "DateValidator"; } ~以下省略~