【问题标题】:Disable page refresh after button click ASP.NET按钮单击 ASP.NET 后禁用页面刷新
【发布时间】:2014-10-21 12:00:31
【问题描述】:

我有一个如下所示的 asp 按钮:

默认.aspx

<asp:button id="button1" runat="server" Text="clickme" onclick="function" />

默认.aspx.cs

protected void function(object sender EventArgs e)
{
    // Do some calculation
}

但是,每当我按下按钮时,整个页面都会刷新。我查看了这个站点并找到了许多解决方案,但没有一个真正适用于我的项目。以下是一些建议的解决方案:

  1. 设置 onclick="return false;" // 但是我如何在代码隐藏中运行该函数?
  2. 在 Page_Load 中使用 !IsPostBack // 但页面仍会完全刷新。我根本不想调用 Page_Load。
  3. 禁用 AutoEventWireup。 // 判断为真或假没有区别。

有没有人可以解决这个问题,还是真的不可能?

【问题讨论】:

  • 使用回调、ajax 或更新面板
  • 真的取决于你想做什么。将 AJAX 视为一种解决方案。此外,您可以使用使用 AJAX 的更新面板。
  • 感谢您的精彩回答。我使用了一个更新面板,它工作得很好!对于像我这样的其他初学者,Dan Wahlin 的这段视频真的很有帮助:youtube.com/watch?v=0hnW8sPJpPQ.

标签: asp.net button postback


【解决方案1】:

我认为这里对 ASP.Net 的工作原理存在根本性的误解。

当用户第一次请求您的页面时,会创建您的 Page 类的一个实例。 ASP.Net 框架通过带有此页面实例的page lifecycle 运行以生成html。然后将 html 响应发送到用户的浏览器。当浏览器收到响应时,它会为用户呈现页面。关键是:在渲染完成时,您的页面类实例可能已经被 .Net 垃圾收集器收集了。消失了,再也见不到了。

从现在开始,所有您的页面需要在服务器上运行的操作,包括您的方法,都是来自浏览器的全新 http 请求的结果。用户点击按钮,一个新的 http 请求被发送到 web 服务器,整个页面生命周期再次运行,从头到尾,带有一个 全新的页面类实例 em>,然后将一个全新的响应发送到浏览器以从头开始重新渲染。这就是 ASP.Net(以及几乎任何其他基于 Web 的技术)的核心工作原理。

幸运的是,您可以采取一些措施来解决这个问题。一种选择是将您当前的大部分 Page_Load 代码放入 if (!IsPostBack) { } 块中。另一种选择是使用[WebMethod] attribute 设置您的方法,并从按钮向该方法发出ajax 请求。其他选项包括从自定义 javascript 和 ASP.Net UpdatePanel 控件调用 Web 服务。

最有效的方法取决于用户可能更改的页面上的其他内容。

【讨论】:

    【解决方案2】:

    这是 asp.net 的正常行为,您实际上是在导致页面的 postback 以便在服务器上调用相关事件。

    我建议使用更新面板但是如果您只需要在后端发生一些事情而不会对网页造成任何重大变化,我会使用 jquery 和网络服务。对我来说,主要原因是更新面板创建了巨大的视图状态对象。

    在这里查看 asp.net ajax:http://www.asp.net/ajax

    这里是 jquery 和 wcf 的示例:http://www.codeproject.com/Articles/132809/Calling-WCF-Services-using-jQuery

    【讨论】:

      【解决方案3】:

      我会将控件放在更新面板中。 为此,您还需要一个脚本管理器,如下所示:

       <asp:ScriptManager runat="server" ID="sm">
       </asp:ScriptManager>
       <asp:updatepanel runat="server">
       <ContentTemplate>
       <asp:button id="button1" runat="server" Text="clickme" onclick="function" />
       </ContentTemplate>
       </asp:updatepanel>
      

      如果更新面板内的控件执行回发,它只会重新加载更新面板内的页面部分。Here 是 MSDN 站点上可能有用的链接。

      【讨论】:

      • 我们是否必须在 ScriptManager 上写任何东西,或者它可以像上面一样为空白?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 2011-02-13
      相关资源
      最近更新 更多