ASP.Net双击问题

Dav*_*her 23 javascript c# asp.net onclick double-click

我的ASP.net页面有点问题.如果用户双击"提交"按钮,它将两次写入数据库(即在图像按钮上执行两次'onclick'方法)

如何使用,如果用户点击图像按钮,只是图像按钮被禁用?

我试过了:

<asp:ImageButton 
     runat="server" 
     ID="VerifyStepContinue" 
     ImageUrl=image src 
     ToolTip="Go" 
     TabIndex="98" 
     CausesValidation="true" 
     OnClick="methodName" 
     OnClientClick="this.disabled = true;" />
Run Code Online (Sandbox Code Playgroud)

但是这个OnClientClick属性完全阻止了页面的提交!有帮助吗?

对不起,是的,我确实有验证控件...因此这个问题很棘手.


到目前为止,目前正在努力解决这个问题:

ASP代码:

 <asp:TextBox ID="hidToken" runat="server" Visible="False" Enabled="False"></asp:TextBox>
 ...
 <asp:ImageButton runat="server" ID="InputStepContinue" Name="InputStepContinue" ImageUrl="imagesrc" ToolTip="Go" TabIndex="98" CausesValidation="true" OnClick="SubmitMethod" OnClientClick="document.getElementById('InputStepContinue').style.visibility='hidden';" />
Run Code Online (Sandbox Code Playgroud)

C#代码:

         private Random
    random = new Random();


    protected void Page_Load(object sender, EventArgs e)
    {
        //Use a Token to make sure it has only been clicked once.
        if (Page.IsPostBack)
        {
            if (double.Parse(hidToken.Text) == ((double)Session["NextToken"]))
            {
                InputMethod();
            }
            else
            {
                // double click
            }
        }

        double next = random.Next();

        hidToken.Text = next + "";
        Session["NextToken"] = next;
Run Code Online (Sandbox Code Playgroud)

实际上......这几乎可行.双击问题几乎是固定的(耶!)虽然图像仍然没有被隐藏.

Noo*_*ilk 21

一般方法是双重的.

Serverside:

  1. 在加载页面时,生成一个令牌(使用System.Random),将其保存在会话中,并将其写入隐藏的表单字段
  2. 在提交时,检查隐藏的表单字段是否等于会话变量(再次设置之前)
  3. 做工作

客户:

与您所拥有的类似,但可能只是隐藏按钮,并将其替换为"提交"等文本.

客户方面需要注意的重要一点是,用户可以通过点击"转义"来取消帖子,所以你应该考虑在这里做什么(取决于它们不会被使用的距离,所以你'我需要将按钮从禁用/隐藏状态恢复.

完整示例如下:

C#(包括在行动中查看它的代码):

<html>
<head runat="server">
    <title>double-click test</title>
    <script language="c#" runat="server">
    private Random
        random = new Random();

    private static int
        TEST = 0;

    public void Page_Load (object sender, EventArgs ea)
    {
        SetToken();
    }

    private void btnTest_Click (object sender, EventArgs ea)
    {
        if( IsTokenValid() ){
            DoWork();
        } else {
            // double click
            ltlResult.Text = "double click!";
        }
    }

    private bool IsTokenValid ()
    {
        bool result = double.Parse(hidToken.Value) == ((double) Session["NextToken"]);
        SetToken();
        return result;
    }

    private void SetToken ()
    {
        double next = random.Next();

        hidToken.Value       = next + "";
        Session["NextToken"] = next;
    }


    private void DoWork ()
    {
        TEST++;
        ltlResult.Text = "DoWork(): " + TEST + ".";
    }
    </script>
</head>
<body>
    <script language="javascript">
        var last = null;
        function f (obj)
        {
            obj.src = "http://www.gravatar.com/avatar/4659883ec420f39723c3df6ed99971b9?s=32&d=identicon&r=PG";
            // Note: Disabling it here produced strange results. More investigation required.
            last = obj;
            setTimeout("reset()", 1 * 1000);
            return true;
        }

        function reset ()
        {
            last.src = "http://www.gravatar.com/avatar/495ce8981a5127a9fd24bd72e7e3664a?s=32&d=identicon&r=PG";
            last.disabled = "false";
        }
    </script>
    <form id="form1" runat="server">
        <asp:HiddenField runat="server" ID="hidToken" />
        <asp:ImageButton runat="server" ID="btnTest"
            OnClientClick="return f(this);"
            ImageUrl="http://www.gravatar.com/avatar/495ce8981a5127a9fd24bd72e7e3664a?s=32&d=identicon&r=PG" OnClick="btnTest_Click" />
        <pre>Result: <asp:Literal runat="server" ID="ltlResult" /></pre>
    </form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • @silky:ASP.Net通过弹力吸管吸引Cheez Whiz的另一个原因.叹.他们本可以将ASP.Net设计为一个合理的Web开发平台,而不是试图让开发人员假装他们仍在编写Windows应用程序,但是没有... (5认同)
  • 在ASP.Net中没有内置的,简单的方法来处理这个问题? (2认同)
  • @silky:一个小的挑剔 - 你不应该在一个`.aspx`页面中使用像这样的静态`Random`而不用它来锁定它. (2认同)
  • 好的.出于对略微错误的尴尬,我写了一个完整的例子.我认为它应该工作(javascript设置禁用可能会有点错误).请测试并告诉我.出于某种原因,我不能休息,直到它工作......:P (2认同)

jru*_*ell 6

如果您在页面上进行了验证,则禁用按钮客户端会变得有点棘手.如果验证失败,您不想禁用该按钮.这是一个添加客户端事件处理程序的代码段:

private void BuildClickOnceButton(WebControl ctl)

{

System.Text.StringBuilder sbValid = new System.Text.StringBuilder();

sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { ");

sbValid.Append("if (Page_ClientValidate() == false) { return false; }} ");

sbValid.Append(ctl.ClientID + ".value = 'Please wait...';");

sbValid.Append(ctl.ClientID + ".disabled = true;");

// GetPostBackEventReference obtains a reference to a client-side script 
// function that causes the server to post back to the page.

sbValid.Append(ClientScript.GetPostBackEventReference(ctl, ""));

sbValid.Append(";");

ctl.Attributes.Add("onclick", sbValid.ToString());

}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此asp.net线程.

更新:上面的代码将用于在代码后面添加OnClientClick处理程序.您也可以在aspx标记中编写javascript,如下所示:

<script type="text/javascript">
function disableButton(button)
{
    // if there are client validators on the page
    if (typeof(Page_ClientValidate) == 'function') 
    {
        // if validation failed return false
        // this will cancel the click event
        if (Page_ClientValidate() == false) 
        { 
            return false; 
        }
    }

    // change the button text (does not apply to an ImageButton)
    //button.value = "Please wait ...";
    // disable the button
    button.disabled = true;

    // fire postback
    __doPostBack(button.id, '');
}
</script>

<asp:ImageButton runat="server" ID="VerifyStepContinue" ImageUrl="button.png" 
    ToolTip="Go" TabIndex="98" CausesValidation="true" OnClick="methodName" 
    OnClientClick="return disableButton(this);" />
Run Code Online (Sandbox Code Playgroud)