2009-11-13 93 views
1

我正在制作一个web应用程序。我更新面板时出现了一个奇怪的错误。ASP.Net的自动回发。当它太慢时会发生什么?

好的,所以说你有两个更新面板,每个更新面板都有一个文本框。这两个文本框都是自动回发的,更新面板有条件地进行更新。

那么,从我观察到的行为来看,好像服务器在处理请求时速度不及用户,那么它在客户端会被忽略。 就像说你在其中一个文本框中键入内容,然后快速选择下一个文本框并键入内容并将其标记出来。这应该导致2回发布。

那么,如果1回发在服务器上处理,另一个发生?该帖子是否会被丢弃在服务器端或客户端?

我在观察这种情况时遇到的主要问题是,第一次发布回发时,会出现更新面板的Update()。那么,当第二封回发出现中断第一封时,它还会在更新面板(另一个)上执行更新。用户看到的是,如果他们非常快速地浏览它(或者服务器处于高负载或任何状态),那么第二个更新面板会被更新,但不是第一个。

TL;博士:当一个回中断另一个回传,这是假设在第一篇文章将被更新回任何更新面板不更新(虽然第二回传的有)

如何我可以解决这个问题还是解决它?我无法更新屏幕上的所有更新面板,因为那时用户当前所在的控件失去了焦点以及大量其他问题。

回答

3

UpdatePanels拦截回发并使用XMLHTTPRequest对象(即他们使用AJAX)向服务器发回请求。

第二个XMLHTTPRequest将取消第一个XMLHTTPRequest,如果第二个XMLHTTPRequest在第二个XMLHTTPRequest正在制作时仍在进行中。就我所知,这是标准行为。

您可能希望将UpdatePanels更新在按钮单击上,而不是将更新附加到每个文本框上的事件(它听起来像您将它们附加到blur事件)。通过这种方式,您可以确保没有进行大量请求,并且可能在请求正在进行时禁用该按钮,以防止新请求取消正在进行的请求。

编辑:

您可以防止其他请求而作出的形式在客户端,而一个请求已在进行通过检查PageRequestManagerisInAsyncPostBack财产。类似以下内容

function pageLoad(sender, args) { 

var pageManager = Sys.WebForms.PageRequestManager.getInstance(); 

// add a function to execute when an asynchronous postback is initialized 
pageManager.add_initializeRequest(checkAsyncPostback); 

} 

function checkAsyncPostback(sender, arg) 
{ 
    var pageManager = Sys.WebForms.PageRequestManager.getInstance(); 
    // check if an async postback is already in progress 
    if (pageManager.get_isInAsyncPostBack()) { 
     // cancel this async postback if one is currently in progress 
     arg.set_cancel(true); 
    } 
} 

从服务器端知道回发是否中断并不是一个简单的方法。

+0

以及我真的希望避免这样做。有没有办法检测到回发从服务器端中断? – Earlz 2009-11-13 21:55:04

0

我无法专门回答您的问题,因为我不知道页面如何管理UpdatePanel及其请求/响应。但是,如果您使用Fiddler跟踪呼叫,您可能很容易知道发生了什么。当请求被解雇你可以看到,你可以看到响应,以及如果一个HTTP错误代码被发送回或抛出一个异常,等:

Fiddler2

0

看看使用UpdateProgress控件: http://www.asp.net/ajax/documentation/live/overview/UpdateProgressOverview.aspx

此外,UpdatePanels是这种事情矫枉过正。看看使用页面方法(谷歌ASP.NET页面方法)

编辑:为了进一步澄清这将如何对你有用,修改UpdateProgress控件中的ProgressTemplate的内容以模态方式显示,以便用户直到请求完成才能执行任何操作。

+0

@it过度杀伤:是的,我知道这是一个简单的例子,但这是一个巨大的应用程序。相信我,这不是过度的 – Earlz 2009-11-13 21:35:43

+0

这是可以理解的。 =)那么在这种情况下,考虑使用UpdateProgress控件和一个ProgressTemplate风格,以模式出现 – zincorp 2009-11-13 21:44:48

相关问题