【问题标题】:Disable Postback on asp.net Button Click在 asp.net 上禁用回发按钮单击
【发布时间】:2012-03-29 04:11:10
【问题描述】:

我想禁用按钮的 onClick 事件的回发。

我在网上做了一些研究,大多数都在使用 onClientClick 和 javascript。有没有办法在 onClick 上调用 asp.net 函数“btnCommit_Click”而不是使用 onclientclick 和使用 javascript?

如果没有,我如何能够将 asp.net 函数与 javascript 结合起来?

<asp:Button ID="btnCommit" runat="server" Text="Save" TabIndex="5" 
    onclick="btnCommit_Click" />

更新 我有一个包含复选框的 GridView,一旦用户进行更改并单击“保存按钮”,就会发生回发,并且我放弃了对复选框所做的所有选择,我正在考虑禁用按钮的 OnClick 事件的回发可以解决这个问题...

【问题讨论】:

  • 我不清楚你到底想做什么。您是希望按钮可点击并禁用多次点击,以便确保只有一次回发,还是希望完全禁用按钮的回发?
  • @Brettski,不,不是……
  • @JoelEtherton,我有一个充满复选框的 GridView,所以当您单击 btnCommit 如果它回发时,我会松开 GridView 和所有复选框...
  • @Nick:听起来您是在根据您已经决定如何解决问题(试图使按钮短路)来描述问题,而不是描述问题本身。退后一步,告诉我们你想在这里实现什么,因为现在还不清楚你想让这个按钮做什么,更不用说你想让它不做什么了。
  • @David sir 是的,先生...我已经对问题进行了 UPDATED 部分。感谢您的建议。

标签: asp.net


【解决方案1】:

我没有完全理解您想要达到的目标。但是,如果你想让 js 和服务器端都在一个 asp.net 按钮上,请同时使用 OnClientClickOnclick。如果要取消回发,请在OnClientClick js 函数中返回false。这样,服务器端的OnClick 事件将永远不会被调用。否则,返回 true 并进行回发。
更新:
根据 cmets 和您更新,如果您想在 gridview 中保留复选框的状态,您必须避免覆盖任何可能影响 Page_Load 事件中控件状态的内容。这仅仅意味着您必须在 Page_Load 事件中检查 (IsPostback),如果它是真的,您不应该对您的 UI 元素做任何事情,否则您将失去它们的状态。

【讨论】:

  • 有没有办法让 OnClick 事件在不加载 page_load 的情况下立即触发...我有一个充满复选框的 GridView,当用户单击保存按钮时,它会将您带到 onClick 函数然后将数据保存到数据库中...当前发生的情况是,如果用户单击保存按钮,Page_Load 再次加载并且复选框所做的所有选择都被删除...
  • 我不确定,但我认为您可以使用视图状态保持复选框状态。但是如果启用了视图状态,那么不幸的是,这就是 asp.net 的邪恶部分:页面生命周期。如果您不想要完整的回发,可以尝试使用 ajax。
  • 那么您应该只在“if(!IsPostBack){}”语句内的页面加载中设置复选框(可能还有 gridview 数据绑定等),以便复选框仅在第一页加载时设置,并且不是在回发期间。查看用法 -> msdn.microsoft.com/en-us/library/…
  • @Simon 这就是我目前设置的方式 if (!IsPostBack) { if (Request.QueryString["ID"] != null) { tbName.Enabled = false; tbDescription.Enabled = 假; } 网格数据绑定(); }
  • @Simon 但即使我在 (!IsPostBack) 中设置了绑定,一旦页面回收,我也看不到任何复选框
【解决方案2】:

听起来您的问题是没有将您的数据绑定和页面设置放在第一页加载检查中。

http://msdn.microsoft.com/en-us/library/system.web.ui.page.ispostback.aspx

private void Page_Load()
{
    if (!IsPostBack)
    {
        // Do your databinding etc here to stop it occuring during postback
    }
}

【讨论】:

  • 我已经这样设置了,但是一旦进入按钮点击事件,它仍然无法获取复选框。
  • 点击触发后,您需要再次调用数据绑定函数来填充网格视图。我经常会有一个名为 SetPageData() 的函数 - 在页面加载检查中调用,然后在单击按钮并执行一些操作后调用。
  • 在初始页面加载期间,我调用了一个函数 gridDataBind(),该函数调用从数据库中获取数据并自动生成默认选择的复选框。一旦用户对这些选择进行更改,当前选择就会被存储回数据库。
  • 所以,如果我再次触发 GridView 绑定,它将丢失用户选择的数据。
  • 不再需要网格绑定,因为 Viewstate 默认为 true。所以它应该保留 HTML。
【解决方案3】:

我有一个包含复选框的 GridView,一旦用户完成 更改并单击“保存按钮”,出现回发,我松了 对复选框所做的所有选择

您必须将Page_Load 下的Page.IsPostback 在is 的值设置为false 期间,如下所示..

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        //Your code
    }
}

这不会导致您在单击按钮后所做的网格复选框选择丢失。


你的GridView EnableViewState must be True


您的模板字段必须在设计器页面中

【讨论】:

  • 这就是我已经拥有的方式。但是在重新加载 Page_Load 并进入按钮单击事件后单击按钮期间,它会丢失 gridview。
  • 按钮点击发生了什么?您是否将网格数据绑定到 null ?
  • protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (Request.QueryString["ID"] != null) { tbName.Enabled = false; tbDescription.Enabled = 假; } 网格数据绑定(); } }
  • 按钮点击发生了什么?
  • 在按钮上单击它会进入 Page_Load 检查它是否是一个回发,然后它会进入 btnCommit_Click() 这就是我检查 GridColumns 并获取所有复选框的地方,当我在 GridColumns 中循环时没有。
【解决方案4】:

虽然您只能将 VBScript 与 Internet Explorer 一起使用(我不相信任何其他浏览器都支持它),但这被认为是不好的做法。要运行 VB/C#.net,您必须对服务器进行某种回发/回调。除此之外,请使用 Javascript。

【讨论】:

    【解决方案5】:

    不要将Autopostback=true用于任何表单控件,如果你想将表单数据发送到服务器端函数

    *表单页面*

     asp:Button ID="btn" runat="server" Text="Post Scrap" OnClick="btn_Click"  
    

    *服务器端*

    Sub btn_Click()
    

    //代码在这里

    End Sub
    

    【讨论】:

      【解决方案6】:

      在我的大多数情况下,我所做的是将按钮转换为

             <input type='button' /> 
      

      以便我可以通过 javascript 或 jquery 访问它。这可能不是你的情况。

      【讨论】:

        【解决方案7】:

        如果您不想在单击 asp 按钮时加载或回发页面,只需将名为 CausesValidation 的属性更改为 false。

        【讨论】:

          猜你喜欢
          • 2011-11-24
          • 1970-01-01
          • 2012-05-26
          • 1970-01-01
          • 2012-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多