onClientClick返回Function()仍会触发OnClick

时间:2018-07-09 14:12:02

标签: javascript html asp.net

在JavaScript中测试Button1_Click是否有效后,尝试阻止其提交数据。尝试了很多次,但是无论我在函数中返回什么,它都会提交。

<form runat="server">
<asp:Button ID="Button1" runat="server" Text="Submit" OnClick="Button1_Click" OnClientClick="return testValidate();" />
</form>

Button1_Click是一个c#函数,当前仅在被调用时提醒我-编辑

我的Javascript函数:

function testValidate() { 
return false;
}

我尝试了一些建议的解决方案,例如使用OnClientClick =“ if(!testValidate())return
假;”

但是这些都不起作用

感谢您的提前帮助

2 个答案:

答案 0 :(得分:1)

很难理解您真正在寻找什么,但是如果您不希望在验证失败时提交表单数据,则需要将其全部转换为JavaScript并设置ajax调用(这需要删除或OnClick事件),或在C#代码函数中进行所有验证,然后可以使用布尔值确定是否提交数据。

JavaScript示例:

function testValidate() { 
    var is_valid = false;
    // Do validation code
    if(is_valid) {
        $..ajax({
           url: //URL location of your webservice,
           method: 'POST',
           contentType: "application/json; charset=utf-8",
           dataType: 'json',
           data: //Form data,
           success: function (data) {

           },
           error: function (data, text, error) {
              alert(error);
           }
        });
     }
}

网络服务方法

[WebMethod]
public void SubmitData(/*Lay out all parameters here*/) 
{
     //Insert form data
}

在OnClick中完成所有操作。 (需要删除OnClientClick,因为将不再需要它)

正面:

<form runat="server">
    <asp:Button ID="Button1" runat="server" Text="Submit" OnClick="Button1_Click" />
</form>

C#:

protected void Button1_Click(object sender, EventArgs e) 
{
     bool isValid = false;
     // Do validation
     if(isValid)
     {
         // submit form data
     }
}

如果我误解了您的期望,我向您道歉,如果我现在给出的信息不符合您的需求,我愿意修改答案。如果不是您要找的东西,请澄清您的问题。谢谢!

编辑:

这就是OnClientClick="return false;"OnClientClick="return testValidate();"不同的原因。

JS将在看到return语句的第二秒返回,无论代码是否完成执行。因此return testValidate();执行一个函数调用并立即返回,而没有给testValidate()一个完成运行的机会,因为return false;立即返回false。

为避免立即返回,请尝试仅使用OnClientClick="var test = testValidate(); setTimeout(function() { return test; }, 10);"。或者,您可以将超时时间限制(在本示例中为10)置于毫秒内,以使返回仅在函数完成并且测试具有值之后才发生。或者,您可以只执行OnClientClick="testValidate();",它将在调用testValidate()之后将其作为布尔值进行评估,这将允许调用函数中的return false;并返回false。我希望这更有意义。

答案 1 :(得分:1)

代替

OnClientClick="return testValidate();"

只写

OnClientClick="testValidate();"