1. Событие
Это проблема, которую я долгое время игнорировал или не обнаруживал. Проблема заключается в следующем:
На странице при наличии элемента управления проверкой, когда элемент управления Button запускает событие OnClientClick и это событие возвращает true и false, элемент управления проверкой станет недействительным и больше не будет работать. Конкретное описание следующее:
Страница .Net выглядит следующим образом:
Скопируйте код кода следующим образом:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<дел>
<asp:TextBox ID="TextBoxTest" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBoxTest"
ErrorMessage="Не может быть пустым" Display="None"></asp:RequiredFieldValidator><ajaxToolkit:ValidatorCalloutExtender
ID="ValidatorCalloutExtender1" TargetControlID="RequiredFieldValidator1" runat="server">
</ajaxToolkit:ValidatorCalloutExtender>
<asp:Button ID="ButtonText" runat="server" Text="Test" OnClientClick="return submit('Вы уверены, что хотите отправить?');" />
</div>
</форма>
Как указано выше, добавьте на страницу элемент управления проверки RequireFieldValidator, чтобы значение TextBoxTest не могло быть пустым. Когда ButtonText отправляет страницу, пользователю предлагается подтвердить, нужно ли ее отправлять. Это очень простая страница, и, похоже, у нее нет проблем. Но если значение TextBoxTest пусто, элемент управления проверкой не работает и страница отправляется успешно. В чем причина этого?
2. Реагируйте на события
Что происходит? Во-первых, после того как я удалил событие OnClientClick из ButtonTest, контроль проверки заработал. Почему это? Я проверил исходный код страницы и обнаружил, что элемент управления ButtonTest генерирует следующий исходный код:
<input type="submit" name="ButtonText" value="Test" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(ButtonText, , true, , false, false))" id="ButtonText" />
Как видно из этой строки исходного кода, элемент управления проверкой генерирует фрагмент кода JavaScript на стороне клиента, чтобы проверить, является ли значение в TextBox пустым. После добавления OnClientClick ButtonTest я повторно проверил исходный код. Исходный код, сгенерированный элементом управления ButtonTest, выглядит следующим образом.
<input type="submit" name="ButtonText" value="Test" onclick="return submit('Вы уверены, что хотите отправить?');WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(ButtonText, , true, , , false, false )) " id="ButtonText" />
Из этой строки кода вы можете ясно увидеть, в чем заключается проблема. На стороне клиента сначала выполняется пользовательский JavaScript, а затем выполняется Javascript, сгенерированный элементом управления проверкой. Очевидно, что в этом случае элемент управления проверкой теряет силу. любое значение.
3. Контроль реагирования
Как только вы узнаете, в чем проблема, ее будет легче решить. Мое решение: перед выполнением пользовательского javascript (возврат подтверждения («Вы уверены, что хотите отправить?») проверьте, соответствуют ли элементы управления на странице требованиям. Rules. поэтому я изменил событие OnClientClick ButtonTest следующим образом:
Скопируйте код кода следующим образом:
<asp:Button ID="ButtonText" runat="server" Text="Test" OnClientClick="if(CheckClientValidate()) return Confirm('Вы уверены, что хотите отправить страницу?');" />
Код метода CheckClientValidate() следующий:
Скопируйте код кода следующим образом:
<script Language="javascript" type="text/javascript">
функция CheckClientValidate(){
Page_ClientValidate();
если (Page_IsValid){
вернуть истину;
}еще{
вернуть ложь;
}
}
</скрипт>
Запускайте, тестируйте. Контроль проверки работает. Проблема решена.
4. Постскриптум
Это проблема и решение, которые я игнорирую. Когда я обнаружил эту проблему, меня прошиб холодный пот. К счастью, я провел строгую проверку на стороне сервера, иначе это было бы ужасно. Отсюда мы также можем увидеть, насколько необходимо указывать строгую проверку на стороне сервера :-). Это не только не позволяет «хакерам» обойти проверку клиента, но и предотвращает неточности данных, вызванные ошибками, незамеченными самим.
Примечание:
Page_ClientValidate(), эта функция используется на страницах aspx, содержащих элементы управления проверки Microsoft, для возврата значения True или False в зависимости от того, является ли операция пользовательского ввода допустимой.
Можно судить напрямую.
Скопируйте код кода следующим образом:
если (Page_ClientValidate())
{
вернуть истину;
}
еще
{
вернуть ложь;
}