(ASP.NET) проверка валидации проверяет до или после обработчика события управления - PullRequest
0 голосов
/ 01 февраля 2019

Я новичок в ASP.NET, просто у меня есть несколько вопросов о том, как работает контроль проверки: допустим, у меня есть учебник и пользовательская проверка, например:

<asp:TextBox ID="txtTest" runat="server" ValidationGroup="test" OnTextChanged="txtTest_TextChanged" />

<asp:CustomValidator ID="CustomValidator" runat="server" ClientValidationFunction="validatePhoneNumbers"  ErrorMessage="xxx" OnServerValidate="CustomValidator_ServerValidate">*</asp:CustomValidator>

и кнопка для отправкиФорма для сервера

 <asp:Button ID="Button" runat="server" OnClick="Button_Click" Text="Submit" />

Допустим, я отключил JavaScript, поэтому нет проверки JavaScript на стороне клиента.

Q1-Каждый элемент управления проверки имеет метод public void Validate ();, поэтому это означает, что Validate ()сначала вызывается метод, который косвенным образом вызывает метод CustomValidator_ServerValidate ()?

В документе Q2-MSDN говорится:

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

, что означает, что сначала вызывается txtTest_TextChanged (), затем CustomValidator_ServerValidate (), поэтому какой смысл проверять Page.IsValid следующим образом:

protected void txtTest_TextChanged(Object sender, EventArgs e)
{
 if (!Page.IsValid) return;

 lblMessage.Text = "Txt changed!";
}

, поскольку IsValid можно установить только после вызова обработчиков событий управления?

1 Ответ

0 голосов
/ 01 февраля 2019

Page.Validate() вызывает неявно в Raise PostBackEvent и вызывает ServerValidate события всех валидаторов на странице.

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

<%@ Page Language="C#" Trace="true" TraceMode="SortByTime" %>

<!DOCTYPE html>
<script runat="server">
    void Page_Load(object sender, EventArgs e)
    {
        Trace.Write("Page_Load call");
    }

    protected void txtTest_TextChanged(object sender, EventArgs e)
    {
        Trace.Write("txtTest_TextChanged call");
        //force validation manually to check Page.IsValid
        Page.Validate(); //comment to cause runtime error in the next row
        Trace.Write("Page is valid", Page.IsValid.ToString());

    }
    //Server side validation. Never trust user input and client side validation
    protected void CustomValidator_ServerValidate(object source, ServerValidateEventArgs args)
    {
        Trace.Write("CustomValidator_ServerValidate call");
        if (args.Value == "123")
            args.IsValid = false;
    }

    protected void Button_Click(object sender, EventArgs e)
    {
        //if (Page.IsValid)
        //{
        //    Trace.Write("Button_Click call. Page.IsValid");
        //}
        Trace.Write("Button_Click call");
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Page event flow</title>
    <script>
        //client side validation. Never trust it.
        //It is for user convenience only
        function validatePhoneNumbers(sender, args) {
            console.log('validatePhoneNumbers',sender.ControlToValidate);
            if (args.Value == '1')
                args.IsValid = false;
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <%-- Show client and server side validation errors --%>
            <asp:ValidationSummary runat="server" ID="vsSummary" />
            <%-- CausesValidation is false by default. No server validation before OnTextChanged --%>
            <asp:TextBox ID="txtTest" runat="server" 
                AutoPostBack="true" 
                OnTextChanged="txtTest_TextChanged" />
            <%-- ControlToValidate is optional for CustomValidator and mandatory for other validators --%>
            <asp:CustomValidator ID="CustomValidator" runat="server" 
                ClientValidationFunction="validatePhoneNumbers" ControlToValidate="txtTest"  
                ErrorMessage="xxx" OnServerValidate="CustomValidator_ServerValidate">*</asp:CustomValidator>
            <%-- CausesValidation is true by default. Server validation occurs before OnClick --%>
            <asp:Button ID="Button" runat="server" OnClick="Button_Click" Text="Submit" />
        </div>
    </form>
</body>
</html>
...