单击按钮禁用加载页面

Disable load page on button click

我试图在单击搜索 imgButton 时在 asp.net 中填充 gridView。问题是,每当我单击此按钮时,页面都会在到达处理搜索单击的事件之前进入加载事件。我找到了一些解决方案:

  1. 我添加了一个 onclick="function();return false;",它运行良好,但我无法再访问在代码隐藏中处理的点击事件,而且我无法从 javascript 访问我的数据库。
  2. 我找到了如下解决方案:

    如果不回发则
    做点什么..
    其他
    做点别的..
    结束 IF

    但页面仍在刷新并进入加载事件。

  3. 我尝试设置 causesValidation = false 但仍然达到加载事件

  4. 我还尝试将 gridView 更改为 AjaxData GridView,并从 javascript 函数调用网络服务来填充我的新网格视图,但我现在在设计中面临 AjaxData 本身的错误,分页数据源...我找不到关于它的有用文档..

那么如何在不加载页面的情况下获取数据并填充 gridView? 以下是我在进行上述更改之前的代码:

    <table>
      <tr>
        <td>
          <asp:ImageButton ID="btnSearch" runat="server" ImageUrl="~/SEARCH.GIF"  CausesValidation="True"  ValidationGroup="GroupSearch" /> 
        </td>
     </tr>
     <tr>
       <td>
          <asp:GridView ID="grdvUserInfo"  AllowPaging="True" PagerSettings-Mode="NextPreviousFirstLast"  PageSize="20" runat="server" AutoGenerateColumns="False" Width="700px" SkinID="grdMySite" DataSourceID="ObjectDataSource1">
             <Columns>
              <asp:BoundField DataField="UserID" Visible="false" HeaderText="UserID" SortExpression="UserID" />
              <asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" />
              <asp:BoundField DataField="ProviderName" HeaderText="ProviderName" SortExpression="ProviderName" />
              <asp:BoundField DataField="IpAddress" HeaderText="IpAddress" SortExpression="IpAddress" />
              <asp:BoundField DataField="TimeIn" HeaderText="TimeIn" SortExpression="TimeIn" />
              <asp:BoundField DataField="TimeOUt" HeaderText="TimeOUt" SortExpression="TimeOUt" />
             </Columns>
         </asp:GridView>
       </td> 
     </tr>
   </table>

在代码隐藏中:

Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
        Try
           If Page.IsValid Then
            provider = New DataProvider
            Me.grdvUserInfo.DataSource = provider.ShowLoginUser(_userName, _providerName, _ip, _dateTimeInFrom, _dateTimeInTo, 0, 20)
            Me.grdvUserInfo.DataSourceID = ""
            Me.grdvUserInfo.DataBind()
            provider.Dispose()
           End If
        Catch ex As Exception
      End Try
    End Sub

非常感谢任何帮助...

ASP .NET 页面生命周期:

您需要了解的第一件事是页面的生命周期在 ASP .NET Web Forms 中是如何工作的。检查 Page Life Cycle。考虑到这个 "rules",每次单击搜索按钮时,将执行以下方法:

1) 页面预初始化

2) 页面初始化

3) 页面初始化完成

4) 页面预加载

5) 页面加载

6) 事件控制。那是你的 btnSearch_Click 方法(尤里卡!)

在这种情况下,您不必担心 1-4 中的事件。但是您应该在 Page_Load 事件中执行以下操作,这样内部代码不会执行多次:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //Do things only when page loads for the first time. 
        }
    }

所以它只是跳过代码的执行到页面生命周期的下一步(6,事件控制,又名btnSearch_Click)。

更新面板控制:

考虑到这些步骤,我建议您使用 Microsoft Ajax 套件,特别是 ASP .NET 控件 Update Panel,这将使您无需在 gridview 中搜索数据加载整个页面。

完整代码如下所示:

     <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
        <table>
          <tr>
            <td>
              <asp:ImageButton ID="btnSearch" runat="server" ImageUrl="~/SEARCH.GIF"  CausesValidation="True"  ValidationGroup="GroupSearch" /> 
            </td>
         </tr>
         <tr>
           <td>
             <asp:UpdatePanel ID="UpdatePanelGridViewSearch" runat="server">
              <ContentTemplate>
               <asp:GridView ID="grdvUserInfo"  AllowPaging="True" PagerSettings-Mode="NextPreviousFirstLast"  PageSize="20" runat="server" AutoGenerateColumns="False" Width="700px" SkinID="grdMySite" DataSourceID="ObjectDataSource1">
                 <Columns>
                  <asp:BoundField DataField="UserID" Visible="false" HeaderText="UserID" SortExpression="UserID" />
                  <asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" />
                  <asp:BoundField DataField="ProviderName" HeaderText="ProviderName" SortExpression="ProviderName" />
                  <asp:BoundField DataField="IpAddress" HeaderText="IpAddress" SortExpression="IpAddress" />
                  <asp:BoundField DataField="TimeIn" HeaderText="TimeIn" SortExpression="TimeIn" />
                  <asp:BoundField DataField="TimeOUt" HeaderText="TimeOUt" SortExpression="TimeOUt" />
                 </Columns>
                </asp:GridView>
               </ContentTemplate>
               <Triggers>
                   <asp:AsyncPostBackTrigger ControlId="btnSearch" EventName="Click"/>
               </Triggers>
            </asp:UpdatePanel>
           </td> 
         </tr>
       </table>

要使用 UpdatePanel 控件,您必须包含 ScriptManager 控件,如果要指示谁是进行异步回发的控件,您应该使用 AsyncPostbackTrigger 属性。

网络方法:

如果您真的想跳过生命周期(Page_Load 事件和其他事件),还有另一种解决方法。

您可以使用 Web 方法,Web 方法是服务器端的方法,可以通过 javascript 访问,您甚至可以访问数据库,但缺点是这些 Web 方法中没有 ViewState,因为它们是静态的,因此您不能直接访问制作数据源或数据绑定的网格。您可以尝试通过 ajax 调用 WebMethod,然后在 javascript 中填充您的网格,但这太复杂了,我会建议您按原样吞下页面生命周期。查看此 Web 方法示例以获取更多信息:Calling ASP.Net WebMethod using jQuery AJAX