Проверка 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.источников. Кажется, сводится к одной строке в

9 52

9 ответов:

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

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

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

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

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

вместо

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

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

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

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

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

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

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

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

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

);

в основном, он заменяет, когда это необходимо,

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

EDIT, вы также можете попробовать отключить сводку проверки.

я столкнулся с проблемой, где использование 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;
        }

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

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

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

попробовать http://msdn.microsoft.com/en-us/library/6379d90d(против.71).аспн

до VS 2005 вы можете установить схему на уровне страницы по страницам.

просто мысли.