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

Сводка валидации ASP.Net заставляет страницу перейти в начало

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

Вот пример:

<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" для всех элементов управления проверкой (отключение проверки клиента)
  • set MaintainScrollPositionOnPostback="true" в директиве страницы

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

EDIT3:

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

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

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

4b9b3361

Ответ 1

Возможны две возможности:

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

* 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>

Ответ 2

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

var ValidationSummaryOnSubmitOrig = ValidationSummaryOnSubmit;
var ValidationSummaryOnSubmit = function() {
    var scrollToOrig = window.scrollTo;
    window.scrollTo = function() { };
    var retVal = ValidationSummaryOnSubmitOrig();
    window.scrollTo = scrollToOrig;
    return retVal;
}

Ответ 3

Вместо

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

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

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

Не уверен, что это лучшее решение, но, похоже, оно выполнило мою работу.

Ответ 4

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

Вот 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 issue, похоже, требует регистрации для просмотра, что делает его обходной путь труднее для доступа.)

Ответ 5

Я использую это: (требуется 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.

Ответ 6

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

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

Ответ 7

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

 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;
        }

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

Ответ 8

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

Ответ 9

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

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

До VS 2005 вы можете установить схему на уровне страницы за страницей.

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