我有一个updatepanel,其中包含一个下拉列表,一旦页面完成加载,该下拉列表将使用最新数据填充下拉列表。数据抓取最多可能需要3分钟。我可以选择让用户“取消”请求并使用最新版本的数据吗?
在updatepanel中,我有一个未绑定的下拉列表(在设计时)。页面完成渲染后,我在updatepanel中调用button.click事件来获取数据:
private void RefreshDDL()
{
hidAction.Value = "";
ddlCampaigns.DataSource = myDataSource;
ddlCampaigns.DataTextField = "Value";
ddlCampaigns.DataValueField = "Key";
ddlCampaigns.DataBind();
ddlCampaigns.Visible = true;
pnlDetails.Attributes.CssStyle.Clear();
pnlPleaseWait.Visible = false;
btnOK.Enabled = true;
}
对象“myDataSource”是我创建的一个对象,它继承了 IEnumarable ,并且有一个公开的public List<DictionaryEntry>
,即“Key”和“Value”发挥作用。
当调用构造函数时,它会转到webservice并获取我想用于下拉列表的数据。此提取需要将近3分钟才能完成,然后将其存储到我的数据库中。然后,我获取数据库表并填充public List<DictionaryEntry>
,然后将其返回到更新面板以供使用。
架构为fetch(第三方)工作的方式是我为数据对象发出请求(通过Web服务)。它会立即返回结果的唯一标识符。然后,我使用服务中的另一个方法并传入唯一ID来检查数据的状态。我每10秒循环检查一次。一旦它返回“完整”消息,我使用相同的唯一ID来获取实际数据:
private void RefreshList()
{
MyProxy proxyRequest = new MyProxy ();
List<string> myList= new List<string>();
if (UpdateNeeded())
{
ProgramManagement.ThirdPartyServiceApi.runReport report = new ProgramManagement.ThirdPartyServiceApi.runReport();
report.reportName = "MyData";
try
{
ProgramManagement.ThirdPartyServiceApi.runReportResponse response = proxyRequest.runReport(report);
while (!ReportComplete(response.@return))
{
System.Threading.Thread.Sleep(10000);
}
StoreList(GetReport(response.@return));
}
catch (SoapException ex)
{
if (ex.Message == TOO_MANY_REQUESTS)
{
//display a message maybe?
}
}
}
AddDataToList();
}
有没有办法在游戏中途停止这个过程?我想我想在while循环中放一个齿轮来阻止它。
感谢阅读。
答案 0 :(得分:1)
您可以调用.abortPostBack();
取消Ajax请求
function CancelPostBack() {
var objMan = Sys.WebForms.PageRequestManager.getInstance();
if (objMan.get_isInAsyncPostBack())
objMan.abortPostBack();
}
有关详细信息,请查看http://www.codedigest.com/Articles/ASPNETAJAX/125_Using_UpdateProgress_Control_Effectively.aspx
答案 1 :(得分:0)
您可以在页面和UpdateProgress
看法内添加ProgressTemplate
,这将取消回发,您将有机会在代码中处理取消。
此外,您应该将此按钮的其他答案中的代码添加到取消回发。