2013-10-02 53 views
21

是否可以使用按钮的onclientclick属性进行客户端检查。如果支票返回true,则触发onclick事件。如果客户检查返回false,请勿触发onclick事件。当onclientclick为false时停止onclick发射?

这可能吗?

UPDATE:

这2工作:

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();" 

它提交表单两次。

这是为什么?

+0

JS代码,请请参阅我尝试过的更新。 – oshirowanen

回答

36

您要添加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> 
+0

请参阅我尝试过的更新。 – oshirowanen

+0

您的更新代码工作。你可以通过创建一个新的aspx(没有母版页)来测试它。这可能与您现有的JavaScript代码干扰mycheck功能有关。 – Win

+0

谢谢你..你节省了我的时间.. –

1

当然可以,在OnClientClick这个函数调用使用preventDefault()

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

} 

OR

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

} 
+0

请参阅我尝试过的更新。 – oshirowanen

7

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

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

请参阅我所尝试过的更新。 – oshirowanen

+0

@oshirowanen我真的不记得为什么你明确地说明为什么你必须在'OnClientClick'中放置'return false'。如果我回想起来,当它呈现实际的HTML和Javascript时,它与ASP.NET在'OnClientClick'内执行的代码有关。 –

1

我也遇到过这个问题。不喜欢在每个链接按钮上放置OnClientClick = return false。通过一个简单的页面,它可以更容易地使用锚点,并避免为你填写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的,但在这种情况下,我认为我们是很好的处理;

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 
} 

//包含用于页面

LiteralControl js = new LiteralControl(); 
panel.Controls.Add(js); 
js.Text [email protected]"<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 ; 
} 
相关问题