年月日ばらばらのテキストボックス

年・月・日がばらばらのテキストボックスの、検証についてなど

基本的な方針は、年・月・日の入力内容を結合するテキストボックスを作り
その内容を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";
    }

~以下省略~