单击按钮时禁用加载页面

时间:2016-12-15 09:57:52

标签: asp.net vb.net onclick pageload page-refresh

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

  1. 我添加了一个onclick =" function();返回false;"这是完美的工作,但我不能再在代码后面处理我的点击事件,我无法从javascript到达我的数据库。
  2. 我找到了一个类似的解决方案:

    如果没有回发那么        做点什么..
      否则
           做别的事。
      结束IF

    但页面仍然刷新并且正在加载事件中进入。

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

  4. 我还尝试将gridView更改为AjaxData GridView,并从javascript函数调用webservice来填充我的新Grid View,但我现在面临设计中的AjaxData错误,分页DataSource ......和我找不到有用的文件......

  5. 那么如何在不加载我的页面的情况下获取数据并填充我的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>
    

    在codeBehind:

    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
    

    我非常感谢任何帮助...

1 个答案:

答案 0 :(得分:1)

ASP .NET页面生命周期:

您需要知道的第一件事是页面的生命周期如何在ASP .NET Web窗体中运行。检查Page Life Cycle。有了这个&#34;规则&#34;请记住,每次单击搜索按钮时,都会执行以下方法:

1)Page pre init

2)Page init

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,Event Control,又名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,因为它们是静态的,所以您无法直接访问制作DataSource或Databind的网格。您可以尝试通过ajax调用WebMethod,然后在javascript中填充您的网格,但这很复杂,我会建议您按原样吞下页面生命周期。请查看此Web方法示例以获取更多信息:Calling ASP.Net WebMethod using jQuery AJAX