Подтвердить что ты не робот

Как я могу предотвратить переход страницы в верхнюю позицию после неудачной проверки?

У меня есть простая страница aspx с несколькими текстовыми блоками и кнопкой отправки. Некоторые поля требуются, и под кнопкой находится ValidationSummary. Полная форма больше, чем высота экрана, поэтому вам нужно прокрутить вниз до кнопки отправки. Если я не заполню все обязательные поля и нажмите, чтобы подтвердить подтверждение отправки, как ожидается, и в сводке проверки появится несколько информационных сообщений под кнопкой. Проверка выполняется на клиенте и не происходит обратная передача.

Так что все работает по своему желанию. Но беспокоит то, что страница перемещается ( "прыгает" ) в верхнее положение, когда я нажимаю кнопку отправки. Чтобы просмотреть сводку проверки, нужно снова перейти вниз по странице.

Я попытался установить свойство ShowSummary на false (что не имеет особого смысла): проверка все еще работает (без обратной передачи), но в этом случае страница не перемещается в верхнюю позицию. Таким образом, проблема, похоже, зависит от визуализации текстов проверки.

Есть ли способ предотвратить переход этой страницы?

Заранее благодарю вас!

Update:

Поведение, описанное выше, похоже, не зависит от браузера. Я тестировал в пяти разных браузерах, и он везде одинаковый.

4b9b3361

Ответ 1

Я задал вопрос об asp.net(http://forums.asp.net/p/1545969/3779312.aspx) и получил ответы на два решения. Лучше всего это Javascript, который поддерживает положение прокрутки:

<script type="text/javascript">
    window.scrollTo = function( x,y ) 
    {
        return true;
    }
</script>

Это нужно только поставить на страницу и некуда позвонить.

Другое решение похоже на предложение RioTera здесь (используя MaintainScrollPositionOnPostBack), но добавляет EnableClientScript="false" в Validators для принудительной обратной передачи. Он тоже работает, но цена - это искусственная обратная передача.

Ответ 2

Вы можете использовать свойство страницы MaintainScrollPositionOnPostBack:

В коде:

Page.MaintainScrollPositionOnPostBack = true;

или в вашей веб-форме:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" MaintainScrollPositionOnPostback="true" %>

Ответ 3

Попробуйте настроить фокус страницы Page.SetFocus(control); У меня есть кнопка вставки, которая добавляет дополнительную строку в мое gridview, что является одним из многих элементов на странице, поэтому я могу добавить Page.SetFocus(control) в качестве последнего метода в мое событие btnInsert_Click.

Ответ 4

Я обнаружил, что установка свойства:

maintainScrollPositionOnPostBack="true"

в вашем разделе Web.config <pages> работает хорошо.

Ответ 5

Страница мерцает, потому что вся страница отправляется обратно на сервер, и содержимое снова отправляется с сервера. Тег UpdatePanel необходим для того, чтобы окружить место, которое вы хотите обновить. Он будет только возвращать информацию, находящуюся внутри тега

<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
    <!-- Place updatable markup and controls here. -->
</ContentTemplate>
</asp:UpdatePanel>

Прочитайте http://msdn.microsoft.com/en-us/library/bb386573(v=vs.100).aspx#CodeExamples

Ответ 6

К сожалению, MantainScrollPositionOnPostback больше не работает в современных браузерах. Для кросс-браузерного решения вы можете использовать этот фрагмент (требуется jQuery):

<asp:HiddenField runat="server" ID="hfPosition" Value="" />
<script type="text/javascript">
    $(function () {
        var f = $("#<%=hfPosition.ClientID%>");
        window.onload = function () {
            var position = parseInt(f.val());
            if (!isNaN(position)) {
                $(window).scrollTop(position);
            }
        };
        window.onscroll = function () {
            var position = $(window).scrollTop();
            f.val(position);
        };
    });
</script>

См. также мой ответ здесь.

Ответ 7

Я использую MVC5, и единственный способ остановить прыжок - это код JQuery ниже.

Я тестировал решение в Safari, Chrome, Mozilla, Internet Explorer и Opera.

$(document).scrollTop($('form#formCheckout').offset().top);
    event.stopPropagation();
    event.preventDefault();