Постбэк срабатывает перед проверкой при использовании CustomValidator

Я сделал простой проект, чтобы объяснить мою проблему.

Это мой Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"        
Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
<form id="form1" runat="server">
    <div>
        <asp:TextBox ID="txtDate" runat="server"></asp:TextBox>
        <asp:CustomValidator    ID="cusDate" 
                                runat="server" 
                                ValidateEmptyText="true" 
                                OnServerValidate="DateValidate" 
                                ValidationGroup="DateVal" 
                                ControlToValidate="txtDate" 
                                ErrorMessage="Date error"></asp:CustomValidator>

        <asp:ImageButton        ID="btnSaveDate" 
                                CausesValidation="true" 
                                ValidationGroup="DateVal" 
                                ImageUrl="~/Images/save_32.png" 
                                runat="server" />
    </div>
</form>
</body>
</html>

А это мой Default.aspx.cs

using System;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)  <<<<<<BREAKPOINT 1 HERE
            {
            }
        }

        protected void DateValidate(Object source, ServerValidateEventArgs args)
        {
            args.IsValid = false;  <<<<<<BREAKPOINT 2 HERE
        }
    }
}

Я устанавливаю две точки останова, как показано выше, и запускаю приложение. Когда я нажимаю «btnSaveDate», он сначала останавливается в точке останова 1, а затем в точке останова 2. Я думал, что сначала он остановится в точке останова 2, затем перезагрузит страницу, а затем остановится в точке останова 1.

Что-то не так в коде или так и должно быть?

Я читал много статей об этом и пробовал много разных решений, но пока ни одно не сработало.


person Ola    schedule 11.03.2014    source источник
comment
Спасибо voddy и Rafa, а как сделать, чтобы валидация происходила до перезагрузки страницы? При использовании RequiredValidator проверка выполняется до перезагрузки страницы.   -  person Ola    schedule 12.03.2014


Ответы (1)


В соответствии с жизненным циклом страницы ASP.NET, Postback обработка событий происходит после события Load.

Если запрос представляет собой обратную передачу, вызываются обработчики управляющих событий. После этого вызывается метод Validate всех элементов управления валидатора, который устанавливает свойство IsValid отдельных элементов управления валидатора и страницы. (В этой последовательности есть исключение: обработчик события, вызвавшего проверку, вызывается после проверки.)

Постбэк означает, что клиент отправляет http-запрос на сервер, и каждый раз, когда запрос поступает на сервер, этапы жизненного цикла страницы выполняются именно в этом порядке. . Итак, второй ответ - нет, невозможно войти в точку останова 2, прежде чем войти в точку останова 1.

person Rafa Paez    schedule 11.03.2014