2013-01-17 123 views
1

我试图阻止多次提交,当用户多次点击链接按钮,但不想使用jQuery。理想情况下,我希望在代码背后做到这一点。防止在没有jQuery的ASP.NET中多次提交按钮点击

我目前的解决方案是基于This Code Project Article

目前我有这样的:

private const string _disableButtonScript = "return disableButton(this.id);"; 

    /// <summary> 
    /// Prevents a button being clicked multiple times on the client 
    /// </summary> 
    /// <param name="currentPage">The page the button resides on</param> 
    /// <param name="button">The button to prevent the multiple clicks on</param> 
    public void PreventMultipleClientClickPostbacks(Page currentPage, LinkButton button) 
    { 
     if (currentPage.IsPostBack || currentPage.IsCallback) 
     { 
      // Already added script 
      return; 
     } 

     AddDisableScriptToPageHeader(currentPage, button); 

     string currentOnClick = string.Empty; 

     // If onclick already exist we need to append to it 
     if (button.Attributes["onclick"] != null) 
     { 
      currentOnClick = button.Attributes["onclick"]; 

      // Remove current onclick 
      button.Attributes.Remove("onclick"); 

      if (!currentOnClick.EndsWith(";")) 
      { 
       // add semi colon suffix 
       currentOnClick = currentOnClick + ";"; 
      } 
     } 

     // add client onclick handler 
     button.Attributes.Add("onclick", string.Format("{0}{1}", currentOnClick, _disableButtonScript)); 
    } 

    /// <summary> 
    /// Adds the javascript disable function to the page header 
    /// </summary> 
    /// <param name="currentPage">The page to add the header script to</param> 
    /// <param name="button">The button to add the script to</param> 
    private static void AddDisableScriptToPageHeader(Page currentPage, Control button) 
    { 
     // Generate disable script 
     StringBuilder scriptLinkHtml = new StringBuilder(); 
     scriptLinkHtml.AppendLine("<script type=\"text/javascript\">"); 
     scriptLinkHtml.AppendLine("//<![CDATA["); 
     scriptLinkHtml.AppendLine("var callCount = 0;"); 
     scriptLinkHtml.AppendLine("function disableButton(btnId) {"); 
     scriptLinkHtml.AppendLine("var ret = true;"); 
     scriptLinkHtml.AppendLine("var ele = document.getElementById(btnId);"); 
     scriptLinkHtml.AppendLine("if (ele != null && !ele.disabled)"); 
     scriptLinkHtml.AppendLine("ret = true;"); 
     scriptLinkHtml.AppendLine("else"); 
     scriptLinkHtml.AppendLine("ret = false;"); 
     scriptLinkHtml.AppendLine("if (ele != null)"); 
     scriptLinkHtml.AppendLine("ele.disabled = true;"); 
     scriptLinkHtml.AppendLine("return ret;"); 
     scriptLinkHtml.AppendLine("}"); 
     scriptLinkHtml.AppendLine("//]]>"); 
     scriptLinkHtml.AppendLine("</script>"); 

     // Add script link to page header 
     LiteralControl scriptLink = new LiteralControl(scriptLinkHtml.ToString()); 
     scriptLink.ID = "disableButtonScript"; 
     currentPage.Header.Controls.Add(scriptLink); 
    } 

这使得从客户端这样的:

<script type="text/javascript"> 
function disableButton(btnId) { 
var ret = true; 
var ele = document.getElementById(btnId); 
if (ele != null && !ele.disabled) 
ret = true; 
else 
ret = false; 
if (ele != null) 
ele.disabled = true; 
return ret; 
} 
</script> 

<a onclick="javascript:return disableButton(this.id);" id="cntMain_btnSubmit" class="but-yellow frcr" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$cntMain$btnSubmit&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))">Add Note</a> 

这很好地工作在Firefox &铬。然而它只在IE中禁用了按钮,并没有提交。

为了让提交工作在IE我不得不添加

currentPage.ClientScript.GetPostBackEventReference(new PostBackOptions(button)) 

进入的JavaScript,这使得根据需要在IE浏览它的工作,但现在提交关于在Firefox & Chrome的每一次点击。

任何人都可以提出修复或替代?

+0

为什么你做服务器端?你可以在简单的javascript和没有jQuery中做同样的事情。 – LoSTxMiND

+0

我想将其添加到可供多个Web应用程序使用的库 – Yetiish

回答

0

我会用布尔标志应该像这样工作试试吧:

private bool _clicked; 

protected void Page_Load(object sender, EventArgs e) { 

     _clicked = false; 
} 


protected void Button_Click(object sender, EventArgs e) { 
if(!_clicked){ 
_clicked = true; 
} 
相关问题