【问题标题】:Stopping onclick from firing when onclientclick is false?当 onclientclick 为 false 时停止 onclick 触发?
【发布时间】:2013-10-09 00:05:18
【问题描述】:

是否可以使用按钮的onclientclick 属性进行客户端检查。如果检查返回true,则触发onclick 事件。如果客户端检查返回false,请不要触发onclick 事件。

这可能吗?

更新:

这两个工作:

Stops the form from submitting:
OnClientClick="return false;"

Allows the form to submit:
OnClientClick="return true;"

接下来的2个不起作用:

// in js script tag
function mycheck() {
    return false;
}

// in asp:button tag
OnClientClick="return mycheck();"

// in js script tag
function mycheck() {
    return true;
}

// in asp:button tag
OnClientClick="return mycheck();"

它两次提交表单。

这是为什么呢?

【问题讨论】:

    标签: asp.net vb.net asp.net-3.5 onclientclick


    【解决方案1】:

    您想在调用函数后在 OnClientClick 中添加 return。否则,即使函数返回 false,按钮也会返回。

    <asp:button ID="Button1" runat="server" OnClick="Button1_Click" 
        OnClientClick="return checkValidation()" Text="Submit" />
    
    <script type="text/javascript">
        function checkValidation() {
            return confirm('Everything ok?');
        }
    </script>
    

    【讨论】:

    • 您更新的代码有效。您可以通过创建一个新的 aspx(没有母版页)来测试它。这可能与您现有的 javascript 代码干扰 mycheck 函数有关。
    • 哈哈!是的,我错过了OnClientClickreturn 部分。谢谢,谢谢!
    • 这并不完全准确。返回 false 只是防止回发。 onclick 方法仍然在服务器端触发,但是它的效果不会更新到屏幕上。如果您使用它来防止数据库更新,请注意该事件仍会触发。
    • @JSON 如果客户端不与服务器通信,服务器如何自己触发点击事件。请注意Http 是无状态的。除非您使用完全不可能的 Signal-R,否则您提到的内容是不可能的。 如果您有问题,请创建一个;我很乐意为您提供帮助。
    • @Win 也许这取决于您使用的服务器类型。我知道 IIS 就是这样的事实。我现在正在使用它,如果可以的话,我会向你证明。
    【解决方案2】:

    当然。如果您在OnClientClick 中使用return false,它将阻止任何导航发生。所以你的代码看起来像:

    <asp:LinkButton runat="server" OnClientClick="if(!ValidatePage()) { return false;}" />
    

    【讨论】:

    • @oshirowanen 老实说,我不记得你为什么明确为什么必须将return false 放在OnClientClick 中。如果我记得,它与 ASP.NET 在呈现实际 HTML 和 Javascript 时围绕您的代码在 OnClientClick 中所做的封装有关。
    【解决方案3】:

    可以,在 onclientClick 函数调用中使用preventDefault()

    function onclientClickFun(e)
    {
      if(!IsValidationSuccess)
     {
       e.preventDefault();
     }
    
    }
    

    function onclientClickFun(e)
    {
      if(!IsValidationSuccess)
     {
       return false;
     }
    
    }
    

    【讨论】:

      【解决方案4】:

      在服务器页面创建按钮

      var button1 = new Button();  
      button1.ServerClick += new EventHandler(button1_ServerClick);
      button1.OnClientClick = SetJsForSaveBtn();
      button1.Attributes.Add("UseSubmitBehavior", "false");
      panel.Controls.Add(button1 );
      

      //包含服务器代码

      private void saveBtn_ServerClick(object sender, EventArgs e)
      {
         //do something if ClientClick returns true
      }
      

      //包含页面的JS代码

      LiteralControl js = new LiteralControl();
      panel.Controls.Add(js);
      js.Text =@"<script type='text/javascript'> 
      $(document).ready(function(){
       function CheckValidationOnClient(){
         if(!ValidatePage()){
          return false;
         }
         else{
          return true;
         }
       };
      });
      </script>   ";
      
      private string SetJsForSaveBtn()
      {
        var jsfunc = @" return CheckValidationOnClient()";
        return jsfunc ;
      }
      

      【讨论】:

        【解决方案5】:

        我也遇到过这个问题。不喜欢在每个链接按钮上都放置 OnClientClick=return false。通过一个简单的页面,使用锚点更容易,避免 asp 为您填充 href。

        但这并不总是可行的。所以一个简单的结论就是继承LinkBut​​ton并添加一个像AutoPostBack这样的变量。如果为 false,则只需使用 html 覆盖输出或添加 OnClientClick。我不太喜欢内联标签。

        namespace My.WebControls {
            [ToolboxData("<{0}:LinkButton runat=server ID=btn></{0}:LinkButton>"), ParseChildren(true), ToolboxItem(true)]
            public class LinkButton : System.Web.UI.WebControls.LinkButton {
        
                 private bool _postback = true;
                 [Bindable(true), Category("Behavior"), DefaultValue(true), Description("Gets or Sets the postback click behavior")]
                 public bool AutoPostBack { get { return _postback; } set { _postback = value; } }
        
        
                 protected override void Render(System.Web.UI.HtmlTextWriter writer) {
                     if(!AutoPostBack){
                         this.OnClientClick = "return false";
                     }
                     base.Render(writer);
                 }
            }
        }
        

        许多属性应该需要在 ViewState 中处理,但在这种情况下,我认为我们很好;

        【讨论】:

          猜你喜欢
          • 2016-04-13
          • 1970-01-01
          • 1970-01-01
          • 2016-09-14
          • 1970-01-01
          • 2018-04-16
          • 1970-01-01
          • 1970-01-01
          • 2013-03-21
          相关资源
          最近更新 更多