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("ctl00$cntMain$btnSubmit", "", true, "", "", false, true))">Add Note</a>
这很好地工作在Firefox &铬。然而它只在IE中禁用了按钮,并没有提交。
为了让提交工作在IE我不得不添加
currentPage.ClientScript.GetPostBackEventReference(new PostBackOptions(button))
进入的JavaScript,这使得根据需要在IE浏览它的工作,但现在提交关于在Firefox & Chrome的每一次点击。
任何人都可以提出修复或替代?
为什么你做服务器端?你可以在简单的javascript和没有jQuery中做同样的事情。 – LoSTxMiND
我想将其添加到可供多个Web应用程序使用的库 – Yetiish