Сводка проверки ASP.Net заставляет страницу перейти наверх - PullRequest
52 голосов
/ 31 марта 2009

У меня есть простая форма с несколькими обязательными полевыми валидаторами и итоговым контролем валидации. Когда я отправляю форму, проверка client приведет к тому, что форма перейдет в начало страницы. Если я удалю сводку проверки, страница не переместится.

Вот краткий пример:

<asp:TextBox ID="test" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="testrequired" runat="server" ControlToValidate="test">*</asp:RequiredFieldValidator>
<asp:ValidationSummary ID="summary" runat="server" />
<asp:Button ID="submit" runat="server" Text="submit" />

Я попытался установить SetFocusOnError="true" в обязательном поле проверки и MaintainScrollPositionOnPostback="true" для хихиканья - даже если это не обратная передача - без какой-либо удачи. Есть ли известное решение этой проблемы?

EDIT:

Я обнаружил проблему в js, сгенерированном WebResource.axd. Кажется, сводится к одной строке в функции ValidationSummaryOnSubmit().

line 534: window.scrollTo(0,0);

Есть идеи, как это убрать или обойти?

EDIT2:

Быстрая работа на данный момент:

  • установить EnableClientScript="false" для всех элементов управления проверкой (отключение проверки клиента)
  • установить MaintainScrollPositionOnPostback="true" в директиве Page

Все еще надеемся на решение на стороне клиента ...

EDIT3:

Кажется, лучше обойти это, просто переопределив функцию window.scrollTo(), чтобы она ничего не делала при вызове скриптом проверки:

<script type="text/javascript">
    window.scrollTo = function() { }
</script>

Добавление вышеперечисленного в любом месте на странице оставляет в силе проверку клиента, но отключает метод window.scrollTo() по всей странице

Ответы [ 9 ]

43 голосов
/ 28 апреля 2009

Два возможных обходных пути:

Отключить проверку клиента и перейти на правильную позицию на обратной стороне сообщения:

* set EnableClientScript="false" for all validation controls (disabling client validation)
* set MaintainScrollPositionOnPostback="true" in Page directive

Отключить функцию scrollTo в JavaScript:

<script type="text/javascript">
    window.scrollTo = function() { }
</script>
18 голосов
/ 10 февраля 2011

Это известная ошибка , как описано в Microsoft Connect. актуальная проблема имеет основу для лучшей работы:

var ValidationSummaryOnSubmitOrig = ValidationSummaryOnSubmit;
var ValidationSummaryOnSubmit = function() {
    var scrollToOrig = window.scrollTo;
    window.scrollTo = function() { };
    var retVal = ValidationSummaryOnSubmitOrig();
    window.scrollTo = scrollToOrig;
    return retVal;
}
11 голосов
/ 28 апреля 2011

вместо

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

, который бы беспорядочно переопределял функцию ScrollTo для всех обратных передач, я поместил эту функцию в событие OnClientClick кнопки. Как показано ниже.

onClientClick="window.scrollTo = function(x,y) { return true; };"

Не уверен, что это лучшее решение, но, похоже, оно мне помогло.

9 голосов
/ 08 апреля 2015

Как указано ответом cleek , это известная ошибка , имеющая обходные пути.

Вот bdukes one , который представляется мне лучшим из доступных на данный момент.

(function () {
  var originalValidationSummaryOnSubmit = window.ValidationSummaryOnSubmit;
  window.ValidationSummaryOnSubmit = function (validationGroup) {
    var originalScrollTo = window.scrollTo;
    window.scrollTo = function() { };
    originalValidationSummaryOnSubmit(validationGroup);
    window.scrollTo = originalScrollTo;
  }
}());

(Он не разместил это прямо здесь, на SO, и теперь проблема connect , кажется, требует регистрации для просмотра, что затрудняет доступ к его обходному пути.)

5 голосов
/ 12 октября 2012

Я использую это: (требуется jquery и jquery.scrollTo)

Сначала вы ставите якорь с определенным классом над сводкой проверки, например:

<a class="custom_valsum_anchor" />
<asp:ValidationSummary ID="valSum" runat="server" EnableClientScript="true" />

затем включите этот бит JavaScript:

$(document).ready(
        function () {
            var $valSum = $(".custom_valsum_anchor");
            if ($valSum.size() > 0) {
                var backup_ValidationSummaryOnSubmit = ValidationSummaryOnSubmit;
                ValidationSummaryOnSubmit = function (validationGroup) {
                    var backup_ScrollTo = window.scrollTo;
                    window.scrollTo = function () { };
                    backup_ValidationSummaryOnSubmit(validationGroup);
                    window.scrollTo = backup_ScrollTo;
                    setTimeout(function () { $("body").scrollTo($valSum); }, 1);
                };
            }
        }

);

По сути, он заменяет, при необходимости, функцию ValidationSummaryOnSubmit версией, которая временно отключает window.scrollTo и прокручивает на якорь. Его не должно быть сложно изменить, чтобы он не использовал jquery.

0 голосов
/ 10 февраля 2011

Я столкнулся с проблемой, где использование MaintainScrollPositionOnPostback=true будет работать но нарушит позицию прокрутки проверки на стороне клиента. Поэтому я добавил сценарий для отображения итогового элемента управления проверкой обратной передачи.

 private void FocusControlOnPageLoad(Control ctrl)
    {

        this.Page.ClientScript.RegisterClientScriptBlock(
          typeof(System.Web.UI.Page), "ctrlFocus",
        @"<script> 
              function ScrollView()
              {
                 var el = document.getElementById('" + ctrl.ClientID + @"')
                 if (el != null)
                 {        
                    el.scrollIntoView();
                    el.focus();
                 }
              }
              window.onload = ScrollView;
        </script>");
    }

с:

protected void Page_PreRender(object sender, EventArgs e)
{
   if (Page.IsValid == false)
        {
          FocusControlOnPageLoad(TheValidationSummary);
        }
}

Похоже, мне также нужно отключить функцию scrollTo:

window.scrollTo = function() {
            return true;
        }

Получил код (в основном) отсюда .

0 голосов
/ 02 апреля 2009

Возможно, вы могли бы унаследовать от требуемого fieldvalidator и переопределить проверку на стороне клиента в пользовательском элементе управления?

0 голосов
/ 31 марта 2009

Страница перейдет туда, где находится ваше резюме проверки. Если вы хотите, чтобы он оставался в нижней части, переместите сводку проверки вниз около кнопки отправки.

РЕДАКТИРОВАТЬ, вы также можете попробовать отключить сводку проверки.

0 голосов
/ 31 марта 2009

Посмотрите на настройку целевой схемы для вашего HTML.

Попробуйте http://msdn.microsoft.com/en-us/library/6379d90d(VS.71).aspx

До VS 2005 вы могли устанавливать схему на странице на уровне страницы.

Просто мысль.

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