ASP多个回发重叠

时间:2018-06-20 07:53:24

标签: javascript asp.net webforms

我有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)。

2 个答案:

答案 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>