Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ASP.NET Новый топик    Ответить
 ASP.NET Validator вынуждает нажимать tab дважды для перехода к другому полю  [new]
Сирин
Member

Откуда: Пермь
Сообщений: 1075
Если введённое значение корректно, то по tab переход на следующее поле осуществляется сразу. Если значение некорректно (не проходит валидацию), то приходится нажимать tab дважды, чтобы перейти на следующее поле. Я так понял, что при потере фокуса (blur) срабатывает валидация, и в случае неправильного ввода фокус остаётся на текущем поле, чтобы пользователь смог исправить значение. Однако при этом никаких сообщений об ошибках не выводится. Они появляются только при отправке формы, при этом фокус устанавливается на первом поле с некорректными данными. Я бы хотел, чтобы фокус менялся сразу, а остальное оставить без изменений, т. е. сообщения ошибках появляются только при отправке формы.
<asp:ValidationSummary runat="server" ValidationGroup="ChangePasswordValidation" />
<asp:TextBox ID="Verification" runat="server" TextMode="Password" CausesValidation="True" />
<asp:TextBox ID="Password" runat="server" TextMode="Password" CausesValidation="True"/>
<asp:TextBox ID="Confirmation" runat="server" TextMode="Password" CausesValidation="True" />
<asp:Button ID="ChangePasswordButton" runat="server" OnClick="ChangePassword_Click" Text="Применить" ValidationGroup="ChangePasswordValidation" />

<asp:RequiredFieldValidator ID="OldPasswordRequiredFieldValidator" runat="server" ControlToValidate="Verification" Display="None" ErrorMessage="Введите старый пароль" SetFocusOnError="true" ValidationGroup="ChangePasswordValidation">
</asp:RequiredFieldValidator>
<asp:RequiredFieldValidator ID="PasswordRequiredFieldValidator" runat="server" ControlToValidate="Password" Display="None" ErrorMessage="Введите пароль" SetFocusOnError="true" ValidationGroup="ChangePasswordValidation">
</asp:RequiredFieldValidator>
<asp:RequiredFieldValidator ID="ConfirmationRequiredFieldValidator" runat="server" ControlToValidate="Confirmation" Display="None" ErrorMessage="Введите повтор пароля" SetFocusOnError="true" ValidationGroup="ChangePasswordValidation">
</asp:RequiredFieldValidator>
<asp:CompareValidator ID="PasswordsCompareValidator" runat="server" ControlToValidate="Password" Display="None" ErrorMessage="Пароль и повтор пароля должны совпадать" SetFocusOnError="true" ValidationGroup="ChangePasswordValidation" ControlToCompare="Confirmation">
</asp:CompareValidator>

ASP.NET 4.0.
21 ноя 12, 12:23    [13506230]     Ответить | Цитировать Сообщить модератору
 Re: ASP.NET Validator вынуждает нажимать tab дважды для перехода к другому полю  [new]
bazile
Member

Откуда:
Сообщений: 3082
Сирин,

Атрибут SetFocusOnError="true" на всех твоих валидаторах на какие-нибудь мысли наводит?
21 ноя 12, 12:29    [13506299]     Ответить | Цитировать Сообщить модератору
 Re: ASP.NET Validator вынуждает нажимать tab дважды для перехода к другому полю  [new]
Сирин
Member

Откуда: Пермь
Сообщений: 1075
Установка SetFocusOnError в False устраняет проблему с табом, но тогда и при сабмите при наличии ошибки не происходит фокусировка на первом невалидном поле. В целом, такое поведение уже приемлемо, но было бы лучше, если бы фокус переходил при сабмите при наличии ошибки.
21 ноя 12, 12:59    [13506633]     Ответить | Цитировать Сообщить модератору
 Re: ASP.NET Validator вынуждает нажимать tab дважды для перехода к другому полю  [new]
bazile
Member

Откуда:
Сообщений: 3082
Сирин
В целом, такое поведение уже приемлемо, но было бы лучше, если бы фокус переходил при сабмите при наличии ошибки.

Напиши свой валидатор, раз не устраивает поведение стандартного.
21 ноя 12, 13:48    [13507150]     Ответить | Цитировать Сообщить модератору
 Re: ASP.NET Validator вынуждает нажимать tab дважды для перехода к другому полю  [new]
Сирин
Member

Откуда: Пермь
Сообщений: 1075
А штатного способа отключения проверки на onblur нет?
21 ноя 12, 15:31    [13508224]     Ответить | Цитировать Сообщить модератору
 Re: ASP.NET Validator вынуждает нажимать tab дважды для перехода к другому полю  [new]
SanSYS
Member

Откуда:
Сообщений: 1879
javascript

Page_Validators - перечисление всех валидаторов на странице
Page_Validators[index].isvalid - валиден ли валидатор
Page_Validators[index].controltovalidate - id элемента проверяемого валидатором

в OnClientClick твоей сабмитящей кнопки можешь написать что-то вроде javascript:return myValidate();

в myValidate пройтись по всем валидоторам на странице, и при встрече первого невалидного - установить фокус (document.getElementById(Page_Validators[index].controltovalidate).focus()) и вернуть false, чтобы не было сабмита
23 ноя 12, 10:52    [13517575]     Ответить | Цитировать Сообщить модератору
 Re: ASP.NET Validator вынуждает нажимать tab дважды для перехода к другому полю  [new]
SanSYS
Member

Откуда:
Сообщений: 1879
Сирин, ну что, справился?
23 ноя 12, 17:54    [13521188]     Ответить | Цитировать Сообщить модератору
 Re: ASP.NET Validator вынуждает нажимать tab дважды для перехода к другому полю  [new]
Сирин
Member

Откуда: Пермь
Сообщений: 1075
SanSYS,

Спасибо за вариант, но пока пошёл по пути наименьшего сопротивления — SetFocusOnError = False. Если потребуется фокусировка, то попробую ваш алгоритм.
26 ноя 12, 10:55    [13527944]     Ответить | Цитировать Сообщить модератору
 Re: ASP.NET Validator вынуждает нажимать tab дважды для перехода к другому полю  [new]
SanSYS
Member

Откуда:
Сообщений: 1879
Сирин
SanSYS,

Спасибо за вариант, но пока пошёл по пути наименьшего сопротивления — SetFocusOnError = False. Если потребуется фокусировка, то попробую ваш алгоритм.

Не правильное решение, ты прежде всего программист, потому должен попробовать, даже если не внедришь, иначе, когда подобная проблема возникнет вновь - придется вновь изобретать велосипед
26 ноя 12, 13:04    [13528933]     Ответить | Цитировать Сообщить модератору
 Re: ASP.NET Validator вынуждает нажимать tab дважды для перехода к другому полю  [new]
Сирин
Member

Откуда: Пермь
Сообщений: 1075
SanSYS,

Инициализируя OnClientClick, мы затираем то, что ASP.NET туда пишет. А он пишет свою функцию, которая валидирует и выводит сообщения об ошибках. Получается, что фокус устанавливается на первом контроле, но сообщения не выводятся.
26 ноя 12, 17:00    [13531216]     Ответить | Цитировать Сообщить модератору
Все форумы / ASP.NET Ответить