下面我采用session和hidden,写了一个submit控件,能够有效的防止重复提交
代码如下:
namespace Shenjk.Controls { /// <summary> /// 防止重复提交 /// http://www.shenjk.com /// </summary> [DefaultProperty("Text")] [ToolboxData("<{0}:Submit runat=server></{0}:Submit>")] public class Submit:System.Web.UI.WebControls.WebControl { private HtmlInputSubmit m_Submit = new HtmlInputSubmit("submit"); private HtmlInputHidden m_Hidden = new HtmlInputHidden(); public Submit() { } #region [Bindable(true)] [Category("Appearance")] [DefaultValue("")] [Localizable(true)] public string Value { get { return m_Hidden.Value; } set { m_Hidden.Value = value; } } [Bindable(true)] [Category("Appearance")] [DefaultValue("发送")] [Localizable(true)] public string Text { get { return m_Submit.Value; } set { m_Submit.Value = value; } } #endregion
protected override void Render(HtmlTextWriter writer) { if (!this.Width.IsEmpty) { this.m_Submit.Style.Add("width", this.Width.ToString()); } if (!this.Height.IsEmpty) { this.m_Submit.Style.Add("height", this.Height.ToString()); } if (!string.IsNullOrEmpty(this.CssClass)) { this.m_Submit.Attributes.Add("class", this.CssClass.ToString()); }
this.m_Hidden.ID = this.ClientID; this.m_Hidden.Value = System.DateTime.Now.ToString(); this.m_Hidden.RenderControl(writer); this.m_Submit.ID = this.ClientID + "_Submit"; this.m_Submit.Attributes.Add("onclick","this.style.border='1px solid #f00';this.value='正在发送...';this.style.backgroundColor='#fff'; /*this.disabled=true;return true;*/"); this.m_Submit.RenderControl(writer); }
public bool IsRefresh() { if (System.Web.HttpContext.Current.Session[this.ClientID]==null || (System.Web.HttpContext.Current.Session[this.ClientID] != null && System.Web.HttpContext.Current.Request.Form[this.ClientID] != System.Web.HttpContext.Current.Session[this.ClientID].ToString())) { return false; } return true; } public void ReSet() { if (System.Web.HttpContext.Current.Session[this.ClientID] != null) { System.Web.HttpContext.Current.Session.Remove(this.ClientID); } } protected override void OnLoad(EventArgs e) { if (System.Web.HttpContext.Current.Request.HttpMethod == "POST") { System.Web.HttpContext.Current.Session[this.ClientID] = System.Web.HttpContext.Current.Request.Form[this.ClientID].ToString(); } base.OnLoad(e); } } }
使用示例:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="test" %> <%@ Register assembly="Shenjk.Controls" namespace="Shenjk.Controls" tagprefix="cc1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>无标题页</title> </head> <body> <form id="form1" runat="server"> <asp:Label ID="Label1" runat="server"></asp:Label><br /> <asp:Label ID="Label2" runat="server"></asp:Label><br /> <cc1:Submit ID="Submit1" Text="发送" Width="100" Height="50" runat="server" /> </form> </body> </html>
using System; using System.Collections; using System.Configuration; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts;
public partial class test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (this.Request.HttpMethod == "POST") { if (Submit1.IsRefresh()) { Label1.Text = "请不要直接刷新页面,且不要重复提交"; }
} } }