asp.net ValidationSummary не отображается после события onChange - PullRequest
1 голос
/ 08 марта 2012

У меня есть простые веб-формы с несколькими <asp:Validators> и одним <asp:ValidationSummary> ...

При отправке формы все работает нормально, рядом с недопустимым текстовым полем отображается '*', а ValidationSummary показывает сообщения об ошибках.

Проблема возникает, когда вы теряете фокус на одном из текстовых полей, нажимая клавишу ввода или щелчок. (событие onChange). '*' Из валидатора отображается, если он недействителен, а ValidationSummary - нет.

Показывает ли ValidationSummary ТОЛЬКО во время отправки нормальное поведение?

Похоже, что это так, поскольку функция js, которая показывает сводку (ValidationSummaryOnSubmit), вызывается только в функции Submit 'Page_ClientValidate' Но это все генерируется JS так ....

<div class="wrapper">
    <h2>
        <asp:Label ID="MainStatus" runat="server" CssClass="successNotification"></asp:Label>
    </h2>
    <form id="form1" runat="server">
    <asp:ValidationSummary ID="LoginUserValidationSummary" runat="server" CssClass="failureNotification"
        ValidationGroup="LoginUserValidationGroup" />
    <asp:Label ID="StatusError" runat="server" CssClass="failureNotification"></asp:Label>
    <!-- <asp:Panel ID="pnlMyForm" runat="server" DefaultButton="LoginButton"> -->
        <fieldset class="login" runat="server" id="FormFieldset">
            <legend>Account Information</legend>
            <p>
                <asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">Username:</asp:Label>
                <asp:TextBox ID="UserName" runat="server" CssClass="textEntry"></asp:TextBox>
                <asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserName"
                    CssClass="failureNotification" Display="Dynamic" ErrorMessage="User Name is required." ToolTip="User Name is required."
                    ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
            </p>
            <p id="CurrentPwd" runat="server">
                <asp:Label ID="CurrentPasswordLabel" runat="server" AssociatedControlID="CurrentPassword">Current Password:</asp:Label>
                <asp:TextBox ID="CurrentPassword" runat="server" CssClass="passwordEntry" TextMode="Password"></asp:TextBox>
                <asp:RequiredFieldValidator ID="ConfirmPasswordValid" runat="server" ControlToValidate="CurrentPassword"
                    CssClass="failureNotification" Display="Dynamic" ErrorMessage="Current Password is required." ToolTip="Current password is required."
                    ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
                <asp:CompareValidator ID="ConfirmPasswordComp" runat="server" ControlToCompare="Password"
                    ControlToValidate="CurrentPassword" CssClass="failureNotification" Display="Dynamic"
                    Operator="NotEqual" ErrorMessage="The current password and new password must be different."
                    ValidationGroup="LoginUserValidationGroup">*</asp:CompareValidator>
            </p>
            <p id="Pwd" runat="server">
                <asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password" Height="21px">New Password:</asp:Label>
                <asp:TextBox ID="Password" runat="server" CssClass="passwordEntry" TextMode="Password"></asp:TextBox>
                <asp:RequiredFieldValidator Display="Dynamic" ID="PasswordRequired" runat="server" ControlToValidate="Password"
                    CssClass="failureNotification" ErrorMessage="New Password is required." ToolTip="New Password is required."
                    ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
            </p>
            <p id="ConfirmPwd" runat="server">
                <asp:Label ID="ConfirmPasswordLabel" runat="server" AssociatedControlID="ConfirmPassword">Confirm Password:</asp:Label>
                <asp:TextBox ID="ConfirmPassword" runat="server" CssClass="passwordEntry" TextMode="Password"></asp:TextBox>
                <asp:RequiredFieldValidator ControlToValidate="ConfirmPassword" CssClass="failureNotification"
                    Display="Dynamic" ErrorMessage="Confirmation Password is required." ID="ConfirmPasswordRequired"
                    runat="server" ToolTip="Confirmation Password is required." ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
                <asp:CompareValidator ID="PasswordCompare" runat="server" ControlToCompare="Password"
                    ControlToValidate="ConfirmPassword" CssClass="failureNotification" Display="Dynamic"
                    ErrorMessage="The password was not correctly confirmed. Please ensure that the new password and confirmed password match exactly."
                    ValidationGroup="LoginUserValidationGroup">&nbsp</asp:CompareValidator>
            </p>
        </fieldset>
        <p class="right">
            <input id="ResetButton" runat="server" type="reset" value="Clear fields" />
            <asp:Button ID="LoginButton" runat="server" Text="Update Password" OnClick="Button_Update_Pwd"
                ValidationGroup="LoginUserValidationGroup" />
            <asp:Button ID="UsrButton" runat="server" Text="Next" OnClick="Button_Check_User"
                ValidationGroup="LoginUserValidationGroup" />
        </p>
        <!-- </asp:Panel> -->
    </form>
</div>

Ответы [ 2 ]

1 голос
/ 10 мая 2012

Это мой обходной путь:

Сохранять последнее сфокусированное поле формы вместе с позициями полосы прокрутки каждый раз, когда поле формы получает фокус, например:

<input id="Text1" type="text" onfocus="SetPageActiveElement(this);" />

<select id="Select1" onfocus="SetPageActiveElement(this);">
    <option>option 1</option>
</select>  

Использование при размытии (onchangeдля выбора) для вызова Page_ClientValidate () и принудительной проверки сводки для обновления ее содержимого.Также на всякий случай очистите последний выделенный элемент от размытия.Таким образом, вы получите что-то вроде:

<input id="Text1" type="text" onfocus="SetPageActiveElement(this);" onblur="ClearValidationSummary();" />

<select id="Select1" onfocus="SetPageActiveElement(this);" onchange="ClearValidationSummary();">
    <option>option 1</option>
</select>

Это мои функции js:

var activeElement;

// This function saves the last element which got focus and saves it on a variable to use it later
// Same thing applies for vertical and horizontal scroll position
function SetPageActiveElement(element) {
    activeElement = element; 
}

function ClearValidationSummary() {
    var vscroll = (document.all ? document.scrollTop : window.pageYOffset);
    var hscroll = (document.all ? document.scrollLeft : window.pageXOffset);
    // Forces page validation to refresh validation summaries
    Page_ClientValidate();

    if (activeElement != null) {
        // Returns the last vertical and horizontal scroll bar position 
        window.scrollTo(hscroll, vscroll);

        SetPageActiveElement(null);
    }
}

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 08 марта 2012
  Is showing the ValidationSummary ONLY during a submit a normal behavior ?

Да. Вот как работают итоговые проверки. Вы всегда можете вызвать функцию Page_ClientValidate самостоятельно, когда вам нужно. Однако он будет оценивать всю страницу, включая все поля, которые вы еще не заполнили, и в которых также есть обязательный валидатор полей, поэтому убедитесь, что именно это вы и хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...