项目中有个列表界面,列表界面中有个一个AutoPostBack属性设置为True的下拉框,这个下拉框用于对表格状态进行筛选,但是在执行的情况很奇怪,每次选择了筛选器以后发现页面还是显示初始状态,即第一次载入页面的内容。通过断点跟踪发现原因是Page_Load执行过两次,Page_Load中的代码结构如下所示:
... {
if (!Page.IsPostBack)
...{
//首次载入页面的执行代码;
//code here;
}
}
通过选择筛选器触发页面回传,第一次执行Page_Load和预想情况一样,由于Page.IsPostBack属性为true,所以不执行页面的初始代码。然后页面执行DropDownList_SelectIndexChange事件响应代码。这个也是正常的。但是奇怪的事情发生了,在执行了DropDownList_SelectIndexChange事件响应代码后,页面再次执行了Page_Load,而且这一次Page.IsPostBack属性为false,即页面是首次载入而不是回传页面。然后页面执行首次载入的初始代码从而造成了无论怎么选择筛选器的值,页面总是显示初始值的原因。
首先想到的是代码中是不是存在跳转到自身的页面的代码,比如:当前页面是a.aspx, 但在代码中存在Response.Redirect("a.aspx")语句,或者在客户端存在window.location.href = 'a.aspx'这种语句,从而造成页面重新载入,但是通过检查代码没有发现。在网络上搜索了一下,发现一篇文章中说可能是图片控件<img/>中的图片地址引(src=...)用了无效地址造成了页面的重新载入。这个给我们提供了一个思路,也就是html或者服务器端控件的属性被赋非法值,那么可能造成也页面的重新早入,通过一点点的去掉html代码,然后进行断点跟踪,发现在table中间的background属性被我赋了一个颜色值,即"#ECECEC"这样的值。而background的合法值应该是一个地址,我的原意是给table设置一个背景颜色,所以这里的属性是bgcolor。就是由于这个原因造成了页面的重新载入,修改后问题解决。
所以在出现页面非正常的多次载入时,可以检查一下自己的HTML源代码,看看时不是有哪个标签的属性被赋了非法值了。