Проблемы CustomValidator в ASP.NET - PullRequest
       5

Проблемы CustomValidator в ASP.NET

0 голосов
/ 14 сентября 2009

EDIT

Исправлена ​​проблема - мне нужно было добавить валидаторы в группу ValidationGroup, а затем вызвать каждый из методов управления валидацией Validate () для поведения отправки кнопки.

    protected void btnDone_Click(object sender, EventArgs e)
    {
        this.cvValidation.Validate();
        this.revYear.Validate();
        if (Page.IsValid)
        {
            DateTime sub = Convert.ToDateTime(String.Format("01/{0}/{1}", ddlMonth.SelectedValue, txtYear.Text));
            string str = sub.ToString("MMMM") + " " + sub.ToString("yyyy");
            pcePopUp.Commit(str);
        }
    }

Я пытаюсь добавить CustomValidator в свой UserControl, но не могу запустить валидатор так, как должен. То, чего я пытаюсь достичь, - это проверить, чтобы увидеть, будет ли месяц / год в будущем.

После взлома кода я заметил, что метод validateDate запускается дважды. Любая помощь в этой ситуации будет принята с благодарностью.

Может ли быть проблема с тем, как я получаю данные из элементов управления, используя следующие два метода.

        private void loadPostBackData()
    {
        loadPostBackDataItem(((TextBox)puymcStartDate.FindControl("txtDate")));
        loadPostBackDataItem(((TextBox)puymcEndDate.FindControl("txtDate"))); 
    }

    private void loadPostBackDataItem(TextBox control)
    {
        string controlId = control.ClientID.Replace("_", "$");
        string postedValue = Request.Params[controlId];

        if (!String.IsNullOrEmpty(postedValue))
        {
            control.Text = postedValue;
        }
        else
        {
            control.Text = String.Empty;
        }
    }

Код пользователя UserControl

Код ASP.NET

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CtrlPopUpYearMonthCalendar.ascx.cs" Inherits="CLIck10.Controls.CtrlPopUpYearMonthCalendar" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>


        <asp:TextBox ID="txtDate" ReadOnly="true" runat="server" />

        <div id="divPopUp" runat="server" class="box" style="width:320px;visibility:hidden;margin-left:5px;">
            <div class="boxTitle">
                <h1>Choose date</h1>
            </div>
            <div style="padding:5px;">
                <asp:UpdatePanel id="upPopUp" UpdateMode="Always" runat="server">
                    <ContentTemplate>
                        <asp:DropDownList ID="ddlMonth" runat="server" /> <asp:TextBox ID="txtYear" runat="server" />
                        <asp:Button ID="btnDone" Text="Done" runat="server" UseSubmitBehavior="false" onclick="btnDone_Click" />
                        <asp:RegularExpressionValidator ID="revYear" ValidationExpression="^[0-9]{4}$" ControlToValidate="txtYear" Display="Dynamic" Text="(*)" ErrorMessage="Year must be valid" runat="server" />
                        <asp:CustomValidator ID="cvValidation" Text="(*)" Display="Dynamic" ErrorMessage="Date must be in the future" OnServerValidate="validateDate" ValidateEmptyText="true" runat="server" />
                        <asp:ValidationSummary ID="vsDate" runat="server" />
                    </ContentTemplate>
                </asp:UpdatePanel>
            </div>
        </div>

<ajaxToolkit:PopupControlExtender ID="pcePopUp" PopupControlID="divPopUp" TargetControlID="txtDate" Position="Right" runat="server" />

Код сзади

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AjaxControlToolkit;
using System.Diagnostics;

namespace CLIck10.Controls
{
    public partial class CtrlPopUpYearMonthCalendar : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                DateTime month = Convert.ToDateTime("01/01/2000");
                for (int i = 0; i < 12; i++)
                {
                    DateTime nextMonth = month.AddMonths(i);
                    ListItem item = new ListItem();
                    item.Text = nextMonth.ToString("MMMM");
                    item.Value = nextMonth.Month.ToString();
                    ddlMonth.Items.Add(item);
                }

                if (txtDate.Text.Equals(String.Empty))
                {
                    ddlMonth.Items.FindByValue(DateTime.Now.AddMonths(1).Month.ToString()).Selected = true;

                    if (DateTime.Now.Month.ToString("MM").Equals("12"))
                    {
                        txtYear.Text = DateTime.Now.AddYears(1).ToString("yyyy");
                    }
                    else
                    {
                        txtYear.Text = DateTime.Now.ToString("yyyy");
                    }
                }
                else
                {
                    DateTime date = Convert.ToDateTime("01, " + txtDate.Text);
                    ddlMonth.Items.FindByValue(date.Month.ToString()).Selected = true;
                    txtYear.Text = date.ToString("yyyy");
                } 
            }
        }

        protected void btnDone_Click(object sender, EventArgs e)
        {
            DateTime sub = Convert.ToDateTime(String.Format("01/{0}/{1}", ddlMonth.SelectedValue, txtYear.Text));
            string str = sub.ToString("MMMM") + " " + sub.ToString("yyyy");
            pcePopUp.Commit(str);
        }

        public void validateDate(object sender, ServerValidateEventArgs e)
        {
                DateTime sub = Convert.ToDateTime(String.Format("01/{0}/{1}", ddlMonth.SelectedValue, txtYear.Text));

                if (sub >= DateTime.Now)
                {
                    e.IsValid = true;
                }
                else
                {
                    e.IsValid = false;
                }
        }
    }
}

После эксперимента с простым встраиванием элемента управления в пустую страницу, он работает, поэтому это должно быть связано со страницей, над которой я работаю.

1 Ответ

1 голос
/ 14 сентября 2009

Я опробовал ваш код как страницу (не пользовательский контроль), и он работал нормально.

Вы динамически добавляете свои элементы управления на страницу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...