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;
}
}
}
}
После эксперимента с простым встраиванием элемента управления в пустую страницу, он работает, поэтому это должно быть связано со страницей, над которой я работаю.