27

是否可以使用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();"

它两次提交表单。

这是为什么?

4

5 回答 5

46

您想return在调用函数后在 OnClientClick 中添加。否则,即使函数返回 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>
于 2013-10-02T14:56:35.750 回答
7

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

<asp:LinkButton runat="server" OnClientClick="if(!ValidatePage()) { return false;}" />
于 2013-10-02T14:52:32.953 回答
2

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

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

}

或者

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

}
于 2013-10-02T14:50:35.393 回答
1

我也遇到过这个问题。不喜欢在每个链接按钮上都放置 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-18T18:51:15.763 回答
1

在服务器页面中创建按钮

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 ;
}
于 2016-10-19T14:44:46.997 回答