2016-07-07 94 views
1

我有一个非常长的表单,必须填写。我有维护ScrollPositionOnPostBack启用,因为我有多个控件隐藏/显示基于用户输入。Asp.net maintainScrollPositionOnPostBack和表单验证失败

由于表单很长,我希望页面能够关注并滚动到导致验证失败的第一个控件,并且我已将重点放在启用验证失败选项上。但是,似乎维护滑动位置打开后置覆盖(控制确实集中,但不向上滚动)。

对此的解决方法的任何想法?到目前为止我尝试过的所有东西都没有奏效。这是一个asp.net webforms项目。

回答

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(注意,我们也需要留下一个天冬氨酸。净增加了,所以我们不能做windows.load =功能...):

<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,但它是用于表单元素的,所以这就是为什么这个解决方法。

希望这会有所帮助!

+0

非常感谢您的回复!我只是试过这个,它确实认可了验证失败的控件的数量。但是,'window.location.hash =“#”+ el [0] .id;'似乎没有做任何事情。我不确定这是为什么。我将继续测试并更新 – mtNewToJava

+0

嗯,它可能是加载事件的顺序,请尝试将此脚本放在body-element的最底部。 – Esko

+0

是的,解决了这个问题!必须把脚本作为页面上的最后一件事!我猜测另一种可能的解决方案是使用更新面板,而不是进行完整的Postback,并且将maintainScrollPositionOnPostBack =“false”,如果我有一些时间,可能会尝试这么晚。非常感谢您的帮助。 – mtNewToJava