ASP.Netvalidation摘要导致页面跳转到顶部

我有一个简单的表单,需要一些必需的字段validation器和validation摘要控件。 当我提交表单时, 客户端validation将导致表单跳转到页面顶部。 如果我删除validation摘要,页面不会移动。

下面是一个简单的例子:

<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" /> 

我已经尝试在所需字段validation器和MaintainScrollPositionOnPostback="true"设置SetFocusOnError="true" ,即使这不是回发 – 没有任何运气。 有这个问题的已知解决scheme吗?

编辑:

我在WebResource.axd生成的js中发现了这个问题。 似乎是在ValidationSummaryOnSubmit()函数中的一行。

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

任何想法如何删除或绕过这个?

EDIT2:

快速解决暂时的问题:

  • 为所有validation控件设置EnableClientScript="false" (禁用客户端validation)
  • 在Page指令中设置MaintainScrollPositionOnPostback="true"

仍然希望客户端解决scheme…

EDIT3:

似乎更好的解决方法是重写window.scrollTo()函数,以便在validation脚本调用时不执行任何操作:

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

在页面上的任何位置添加上述内容都会使客户端validation无效,但会在整个页面中禁用window.scrollTo()方法

两个可能的解决方法:

禁用客户端validation并在回发时跳转到正确的位置:

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

在javascript中禁用scrollTo函数:

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

这是Microsoft Connect上logging的已知错误 。 相关问题有最佳解决scheme的基础:

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

不知道这是不是最好的解决scheme,但似乎已经为我做了这个工作。

正如cleek的回答所述 ,这是一个已知的错误,有解决方法。

这是bdukes之一 ,这在我看来是目前最好的。

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

(他没有直接在这里发布,现在连接问题似乎需要注册才能看到,这使得他的解决方法难以访问。)

我使用这个:(需要jQuery和jQuery.scrollTo)

首先,在你的validation总结之上放置一个具有特定类的锚点,如下所示:

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

基本上,它将在必要时replaceValidationSummaryOnSubmit函数,该函数暂时禁用window.scrollTo并滚动到锚点。 它不应该很难修改,以便它不使用jQuery。

该页面将跳转到您的validation摘要所在的位置。 如果您希望它靠近底部,请在提交button旁边移动validation摘要。

编辑,你也可以尝试closuresvalidation摘要。

我遇到了一个问题,使用MaintainScrollPositionOnPostback=true将工作,但会破坏客户端validation滚动位置。 所以我添加了一个脚本,在回发中将validation摘要控件放入视图中。

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

从这里得到了代码(大部分)。

也许你可以从必要的fieldvalidatorinheritance并覆盖自定义控件中的客户端validation?

看看为你的html设置目标模式。

尝试http://msdn.microsoft.com/en-us/library/6379d90d(VS.71).aspx

在VS 2005之前,您可以在页面级别上设置架构。

只是一个想法。