下面我采用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 = "请不要直接刷新页面,且不要重复提交"; }
} } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现