CustomValidator не выполняется на втором шаге многопанельной страницы - PullRequest
1 голос
/ 04 июля 2011

У меня проблема с ASPX-страницей, на которой не выполняется CustomValidator. Страница состоит из 3 панелей ASP, которые меняют видимость для каждого шага в трехэтапном процессе. Первый шаг / панель работает, как и ожидалось, выполняя все CustomValidators, когда я нажимаю кнопку отправки. Если эта кнопка действительна, нажатие кнопки скрывает ее панель и показывает вторую панель для шага № 2, которая содержит другой CustomValidator. При нажатии кнопки «Отправить» на этой второй панели CustomValidator никогда не запускается, и страница всегда сообщает, что это IsValid.

Я воспроизвел это поведение в небольшом примере приложения. Вот соответствующий код ...

Default.aspx

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>
        Welcome to ASP.NET!
    </h2>
    <p>
        To learn more about ASP.NET visit <a href="http://www.asp.net" title="ASP.NET Website">www.asp.net</a>.
    </p>
    <p>
        You can also find <a href="http://go.microsoft.com/fwlink/?LinkID=152368&amp;clcid=0x409"
            title="MSDN ASP.NET Docs">documentation on ASP.NET at MSDN</a>.
    </p>
    <asp:Panel ID="Panel1" runat="server" Visible="true">
        <div>
            <asp:CustomValidator 
                ID="CustomValidator1" 
                runat="server" 
                ControlToValidate="TextBox1"
                ValidateEmptyText="true"
                Display="Dynamic" 
                OnServerValidate="CustomValidator1_ServerValidate">
            </asp:CustomValidator>
        </div>
        <div>
            <asp:Label ID="Label1" runat="server" Text="Type in anything:" AssociatedControlID="TextBox1" />
            &nbsp;
            <asp:TextBox ID="TextBox1" runat="server" />
        </div>
        <div>
            <asp:Button ID="Button1" runat="server" Text="Show Panel #2" OnClick="Button1_Click" />
        </div>
    </asp:Panel>
    <asp:Panel ID="Panel2" runat="server" Visible="false">
        <div>
            <asp:CustomValidator 
                ID="CustomValidator2" 
                runat="server" 
                Display="Dynamic" 
                OnServerValidate="CustomValidator2_ServerValidate">
            </asp:CustomValidator>
        </div>
        <div>
            <asp:Button ID="Button2" runat="server" Text="I should cause an Exception..." OnClick="Button2_Click" />
        </div>
    </asp:Panel>
    <asp:Panel ID="Panel3" runat="server" Visible="false">
        <p>An exception should have been thrown. :(</p>
    </asp:Panel>
</asp:Content>

Default.aspx.cs

public partial class Default : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        Panel1.Visible = true;
        Panel2.Visible = false;
        Panel3.Visible = false;
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            Panel1.Visible = false;
            Panel2.Visible = true;
            Panel3.Visible = false;
        }
    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            Panel1.Visible = false;
            Panel2.Visible = false;
            Panel3.Visible = true;
        }
    }

    protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
    {
        string userEnteredText = TextBox1.Text;
        if (string.IsNullOrEmpty(userEnteredText))
        {
            CustomValidator1.Text = "Text is required!";
            args.IsValid = false;
        }
        else if (!userEnteredText.ToLower().Equals("anything"))
        {
            CustomValidator1.Text = "You didn't type 'anything'! ;)";
            TextBox1.Text = null;
            args.IsValid = false;
        }
        else
        {
            args.IsValid = true;
        }
    }

    protected void CustomValidator2_ServerValidate(object source, ServerValidateEventArgs args)
    {
        throw new Exception("This ServerValidate() method never triggers!");
    }
}

Я не понимаю, почему метод CustomValidator2 никогда не выполняется. Кто-нибудь может объяснить это поведение?

Ответы [ 2 ]

1 голос
/ 04 июля 2011

Поскольку вы не устанавливаете свойство ControlToValidate в своем сценарии, установите для свойства ValidateWhenEmpty значение true для CustomValidator.

CustomValidator не будет оцениваться, если ControlToValidate будет пустым, если только ValidateWhenEmpty не имеет значение true.

ОБНОВЛЕНИЕ:

Хорошо, это было неправильно.Но вам действительно нужно установить видимость панелей в Page_Load?Вы сделали это уже декларативно в .aspx.Если вы удалите его из Page_Load, валидатор работает.Я полагаю, это не работает, если валидатор Visible = false или находится внутри содержащего элемента управления Visible = false.

0 голосов
/ 04 июля 2011

Необходимо использовать свойство ValidationGroup кнопок и соответствующие элементы управления проверки на каждой панели.

...