2009-09-14 3 views
0

EDITпроблем CustomValidator внутри ASP.NET

Исправлена ​​проблема - мне нужно, чтобы добавить валидатор к 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

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

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

+0

Элементы управления пользователя не добавляются динамически. Однако я получаю данные post из элементов управления, используя эти два метода, которые, скорее всего, вызывают проблемы. http://tms.pastebin.com/m21627708http://tms.pastebin.com/m21627708 – Malachi

+0

Я завернул код внутри события нажатия кнопки в условном выражении Page.IsValid, и это сработало, но все же метод проверки стреляет дважды. – Malachi