Сводка валидации 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()
на всей странице
Ответы
Ответ 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 вы можете установить схему на уровне страницы за страницей.
Просто мысль.