我有一个很长的表格,必须填写。我有maintainScrollPositionOnPostBack启用,因为我有多个控件隐藏/显示基于用户输入。
由于表单很长,我希望页面能够聚焦并滚动到导致验证失败的第一个控件,并且我专注于启用验证失败选项。但是,似乎maintainScrollPositionOnPostBack会覆盖它(控件确实会聚焦,但不会向上滚动)。
有关解决方法的任何想法吗?到目前为止,我所尝试的一切都没有奏效。这是一个asp.net webforms项目。
答案 0 :(得分:0)
这是一个很好的问题,而且非常棘手。但是我设法得到了一个你可以尝试的版本,也许还可以构建。
MaintainScrollPositionOnPostback =" true" -setting在表单提交和窗口加载上设置一系列javascript事件,这些就像你说的那样,"覆盖"验证者设定的焦点。
所以我所做的是为所有验证器添加一个通用的css类,如:
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" CssClass="error" ErrorMessage="RequiredFieldValidator" SetFocusOnError="true"
EnableClientScript="false" ControlToValidate="TextBox1"></asp:RequiredFieldValidator>
然后我向window.load添加了另一个eventlistener(注意我们还需要保留Asp.Net添加的那个,所以我们不能做windows.load = function ...):
<script>
window.addEventListener("load", function () {
var el = document.getElementsByClassName("error");
if (el.length > 0) {
window.location.hash = "#" + el[0].id;
}
});
</script>
在这里,您可以从jQuery使用中获益,以便能够支持更多浏览器,但addEventListener是pretty well supported。
脚本搜索errormessage并通过它的id来锚定它。 Javascript有focus-method但它适用于表单元素,这就是为什么这种解决方法。
希望这有帮助!