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之前,您可以在页面级别上设置架构。
只是一个想法。