我有ASP Web Forms Web应用程序,用于在数据库中搜索。我有一个页面,其中包含gridview和用于过滤结果的文本输入字段。
输入字段具有onkeyup事件,该事件由JavaScript运行回发以从代码隐藏中刷新gridview。
在代码背后也有一个方法,该方法确实保存了最后一个过滤器请求的状态,如果请求不等于先前的过滤器请求,那么我将向数据库运行新查询。
我的问题-文本输入字段上的onkeyup事件可能会产生多个回发。如果首先回发,则服务器将对数据库执行查询。但是后续回发不会执行,并且不会重叠第一个结果。因此,我的gridview保持旧状态。
<script type="text/javascript">
function DoUpdateGridView() {
var timeout = null;
clearTimeout(timeout);
timeout = setTimeout(function () {
Sys.WebForms.PageRequestManager.getInstance()._doPostBack('<%=GUIGridUpdatePanel.ClientID%>', '<%=GUIGridUpdatePanel.UniqueID%>');
}, 1000);
};
</script>
您可能会看到我为执行JavaScript设置了延迟,但这只是延迟了代码的执行而不会中断。
我认为我可能首先取得缓存结果,然后将其返回。 但是我需要知道该问题的所有解决方案。
有没有办法只执行JavaScript中的最新事件? 但是随后有人可能会发送多个请求,而我的Web应用程序可能会崩溃(DDOS)。答案 0 :(得分:0)
当同一客户端同时进行两次(或更多)回发时,它们将相同的ViewState数据作为每个请求的一部分发送到服务器。控件状态是ViewState的一部分。假设正在date(from:)
处理会话,则服务器将按顺序处理这些请求。
比方说,服务器在处理第一个请求时会更改控件。然后处理第二个请求。但是由于两个回发都是同时生成的,因此第二个请求与第一个请求具有相同的ViewState(因此具有相同的控件状态),因此服务器看到的控件的状态为之前第一个请求已处理,而不是第一个请求之后的状态 !
最简单的解决方案是存储您要用来确定是否更改会话中控件的状态,默认情况下,这些状态存储在服务器的内存中,从而使这两个请求可区分。
答案 1 :(得分:0)
您无法中断服务器上已经发生的事情,但是“延迟”代码存在问题。您需要在两次调用之间保留timeout
变量。
尝试:
<script type="text/javascript">
//New Position for timeout variable
var timeout = null;
function DoUpdateGridView() {
//This will now clear the existing timneout function
clearTimeout(timeout);
timeout = setTimeout(function () {
//For debug purposes only
console.log("About to postback");
Sys.WebForms.PageRequestManager.getInstance()._doPostBack('<%=GUIGridUpdatePanel.ClientID%>', '<%=GUIGridUpdatePanel.UniqueID%>');
}, 1000);
};
</script>