【问题标题】:how to set a loading gif on ImageButton when the onclick event is executing code behind当 onclick 事件在后面执行代码时如何在 ImageButton 上设置加载 gif
【发布时间】:2012-08-23 19:16:30
【问题描述】:

我对 web 开发还很陌生,在执行导出后的代码时,我似乎无法显示加载 gif。

我的 onclick 事件位于 gridview 内的 Imagebutton 上。你能帮我么?这里我有 ImageButtons:

<HeaderTemplate>
      <asp:ImageButton ID="btnExport"  OnClick="btnExport_Click" runat="server" ImageUrl="~/Images/excel.gif"  AlternateText="Export top records!"/>
      <asp:ImageButton ID="btnExportRed"   OnClick="btnExportRed_Click" runat="server" ImageUrl="~/Images/excel_red.gif"  AlternateText="Export all records!"/>
 </HeaderTemplate>

这是我的代码:

protected void btnExport_Click(object sender, EventArgs e)
 {
    try
    {
        LoadWaitImage();


          [functional code]

      UnloadWaitImage();
    }
    catch (Exception ex)
    {
        lblMessage.Text = ex.Message;
        upnlMsg.Update();
       UnloadWaitImage();
    }
}


private void LoadWaitImage()
 {
    ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "showMyImage", "hideLoading()", true);
 }

private void UnloadWaitImage()
{
    ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "showMyImage", "hideLoading()", true);
}

和要触发的js:

function showLoading() 
{
   document.getElementById('lblMessage').value = "";
   document.getElementById('ucMarketing_btnSearch').disabled = true;
   document.getElementById('btnClearFilters').disabled = true;
   document.getElementById('imgSaveToSegments').disabled = true;
   document.getElementById('divLoadingImg2').style.display = "";
 }
function hideLoading()
{
  document.getElementById('ucMarketing_btnSearch').disabled = false;
  document.getElementById('btnClearFilters').disabled = false;
  document.getElementById('imgSaveToSegments').disabled = false;
  document.getElementById('divLoadingImg2').style.display = "none";
 }

【问题讨论】:

  • LoadWaitImage 打电话给hideLoading(),是不是打错字了?
  • 是的,它是: private void LoadWaitImage() { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "showMyImage", "showLoading()", true); } private void UnloadWaitImage() { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "hideMyImage", "hideLoading()", true); }
  • 另外,这里是包含图像的 div: 它在GridView之外但在相同的更新面板
  • 在 cmets 中阅读代码非常困难,您最好编辑您的问题并将其放在那里。

标签: javascript onclick loading code-behind


【解决方案1】:

最后,我使用了一个 OnClientClick 事件来启动我的 Js。 OnClick 事件为导出执行我的服务器端功能。在我的导出函数中,我添加了一个唯一的 cookie 令牌。我将该令​​牌存储在一个隐藏字段中,并每秒更改一次。在 Js 函数中,我启动计时器并检查 cookie 是否与令牌匹配。如果是这样,我会隐藏我的加载图像。

我在这里找到了这个解决方案: Detect when browser receives file download.

这是一个例子: http://geekswithblogs.net/GruffCode/archive/2010/10/28/detecting-the-file-download-dialog-in-the-browser.aspx.

【讨论】:

    【解决方案2】:

    我认为你目前的想法行不通。呈现 HTML 的客户端浏览器与运行代码隐藏的服务器完全分离。单击 ImageButton 时,浏览器会将您的 HTML 表单同步发布到服务器,并等待响应。此响应将在您的事件处理程序方法结束后的某个时间发送。

    如果您想在客户端执行操作(例如显示和隐藏图像),您将需要使用 AJAX 异步执行操作。 ASP.Net WebForms 使用UpdatePanel 控件使这变得非常容易。

    要使其正常工作,您可以用 UpdatePanel 控件围绕您要更改的页面区域。然后添加一个或多个要引起更新的触发器。最后使用UpdateProgress 控件显示您的加载图像。像这样的:

    <asp:GridView runat="server">
       ...
       <HeaderTemplate>
          <asp:ImageButton ID="btnExport" OnClick="btnExport_Click" runat="server" 
                ImageUrl="~/Images/excel.gif"  AlternateText="Export top records!"/>
          <asp:ImageButton ID="btnExportRed" OnClick="btnExportRed_Click" runat="server"
                ImageUrl="~/Images/excel_red.gif"  AlternateText="Export all records!"/>
       </HeaderTemplate>
    </asp:GridView>
    
    <asp:UpdatePanel ID="Update" runat="server">
       <asp:UpdateProgress ID="Progress" runat="server">
          <ProgressTemplate>
             <!-- HTML/ASP for your image -->
          </ProgressTemplate>
       </asp:UpdateProgress>
       <Triggers>
          <asp:AsyncPostBackTrigger ControlID="btnExport" EventName="Click" />
       </Triggers>
    </asp:UpdatePanel>
    

    如果您想做更多客户端的事情,请参阅this answer

    【讨论】:

    • 非常感谢您的帮助。我尝试将按钮包装在 UpdatePanel 中,但似乎 AsyncPostBack 不喜欢 Response.BinaryWrite。当我进行导出时,我无法摆脱它。
    • 啊,好吧,我不知道你在做什么。我猜您需要一些客户端代码(例如 jQuery click 事件处理程序)来在请求发送到服务器之前显示加载图像。但是我不确定在这种情况下动画是否会继续。
    • 是的,这正是我解决问题的方法。看我的回答:)。再次非常感谢
    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 2021-12-30
    • 2017-05-18
    • 2022-09-24
    • 2012-04-30
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    相关资源
    最近更新 更多