Innanzitutto, si tratta di un tradizionale Button che al click si disabilita, ma in grado anche di controllare la presenza di Validator nella pagina. Avevo trovato il codice di questo webcontrol un po' di tempo fa.L'avevo utilizzato in un mio progetto personale e non mi aveva mai datoproblemi fino a oggi, quando mi sono scontrato sulla sua inefficacia incaso di ValidationGroup. Armato di pazienza ecco che mi sono preso in mano il codice ed ho eseguito le modifiche del caso. Forse può essere utile ad altri, ed ecco il codice completo:
using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Drawing; namespace AZWebControls { [ToolboxBitmap(typeof(System.Web.UI.WebControls.Button)), DefaultEvent("Click"), DefaultProperty("Text")] public class ClickOnceButton : System.Web.UI.WebControls.WebControl, IPostBackEventHandler, IButtonControl { public event EventHandler Click; public event System.Web.UI.WebControls.CommandEventHandler Command; private string OnceClickBtnName = "__onceClickBtn"; [Browsable(true), Category("Behavior")] public bool DisableAfterClick { get { object o = base.ViewState["DisableAfterClick"]; return ((o == null) ? false : (bool)o); } set { base.ViewState["DisableAfterClick"] = value; } } [Browsable(true), Category("Behavior")] public string CommandName { get { object o = base.ViewState["CommandName"]; return ((o == null) ? string.Empty : (string)o); } set { base.ViewState["CommandName"] = value; } } [Browsable(true), Category("Behavior")] public string CommandArgument { get { object o = base.ViewState["CommandArgument"]; return ((o == null) ? string.Empty : (string)o); } set { base.ViewState["CommandArgument"] = value; } } [Browsable(true), Category("Appearance")] public string DisabledText { get { object o = base.ViewState["DisabledText"]; return ((o == null) ? string.Empty : (string)o); } set { base.ViewState["DisabledText"] = value; } } [Browsable(true), Category("Appearance")] public string Text { get { object o = base.ViewState["Text"]; return ((o == null) ? "Button" : (string)o); } set { base.ViewState["Text"] = value; } } [Browsable(true), Category("Behavior")] public bool CausesValidation { get { object o = base.ViewState["CausesValidation"]; return ((o == null) ? true : (bool)o); } set { base.ViewState["CausesValidation"] = value; } } public ClickOnceButton() : base(HtmlTextWriterTag.Input) { } [Browsable(false)] internal string GetClientValidateEvent { get { if (string.IsNullOrEmpty(this.ValidationGroup)) return "if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); "; else return "if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate('"+this.ValidationGroup+"'); "; } } [Browsable(false)] internal string GetClickOnceClientValidateEvent { get { if (string.IsNullOrEmpty(this.ValidationGroup)) return "if (typeof(Page_ClientValidate) == 'function') { if(Page_ClientValidate()) { " + GetOnceClickJavascript + " }} else { " + GetOnceClickJavascript + " }"; else return "if (typeof(Page_ClientValidate) == 'function') { if(Page_ClientValidate('"+this.ValidationGroup+"')) { " + GetOnceClickJavascript + " }} else { " + GetOnceClickJavascript + " }"; } } [Browsable(false)] internal string GetOnceClickJavascript { get { return "document.getElementsByName('" + this.OnceClickBtnName + "').item(0).setAttribute('name'," + "this.getAttribute('name')); this.disabled = true; " + (DisabledText == string.Empty ? string.Empty : "this.value = '" + DisabledText + "';") + "this.form.submit();"; } } protected override void RenderContents(HtmlTextWriter writer) { } protected override void AddAttributesToRender(HtmlTextWriter writer) { string strOnClick; if ((base.Page == null)) { base.Page.VerifyRenderingInServerForm(this); } writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit"); writer.AddAttribute(HtmlTextWriterAttribute.Name, base.UniqueID); writer.AddAttribute(HtmlTextWriterAttribute.Value, this.Text); if ((base.Page != null) & this.CausesValidation & base.Page.Validators.Count > 0) { if (this.DisableAfterClick) { strOnClick = this.GetClickOnceClientValidateEvent; } else { strOnClick = this.GetClientValidateEvent; } if (base.Attributes.Count > 0 & (base.Attributes["onclick"] != null)) { strOnClick = string.Concat(base.Attributes["onclick"], strOnClick); base.Attributes.Remove("onclick"); } writer.AddAttribute("language", "javascript"); writer.AddAttribute(HtmlTextWriterAttribute.Onclick, strOnClick); } else if (DisableAfterClick == true) { strOnClick = GetOnceClickJavascript; if (base.Attributes.Count > 0 & (base.Attributes["onclick"] != null)) { strOnClick = string.Concat(base.Attributes["onclick"], strOnClick); base.Attributes.Remove("onclick"); } writer.AddAttribute("language", "javascript"); writer.AddAttribute(HtmlTextWriterAttribute.Onclick, strOnClick); } base.AddAttributesToRender(writer); } protected override void OnInit(EventArgs e) { if (DisableAfterClick && !IsHiddenFieldRegistered()) { base.Page.ClientScript.RegisterHiddenField(this.OnceClickBtnName, ""); //base.Page.RegisterHiddenField(this.OnceClickBtnName, ""); } base.OnInit(e); } private bool IsHiddenFieldRegistered() { foreach (Control ctl in base.Page.Controls) { if (ctl is HtmlInputHidden) { if (ctl.ID == this.OnceClickBtnName) { return true; } } } return false; } protected virtual void OnClick(EventArgs e) { if (Click != null) { Click(this, e); } } protected virtual void OnCommand(System.Web.UI.WebControls.CommandEventArgs e) { if (Command != null) { Command(this, e); } } void System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(string eventArgument) { if (this.CausesValidation) { base.Page.Validate(); } this.OnClick(new EventArgs()); this.OnCommand(new System.Web.UI.WebControls.CommandEventArgs(this.CommandName, this.CommandArgument)); } #region IButtonControl Members [UrlProperty("*.aspx"), Editor("System.Web.UI.Design.UrlEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(System.Drawing.Design.UITypeEditor)), Themeable(false), DefaultValue("")] public virtual string PostBackUrl { get { string str = (string)this.ViewState["PostBackUrl"]; if (str != null) { return str; } return string.Empty; } set { this.ViewState["PostBackUrl"] = value; } } [DefaultValue(""), Themeable(false)] public virtual string ValidationGroup { get { string str = (string)this.ViewState["ValidationGroup"]; if (str != null) { return str; } return string.Empty; } set { this.ViewState["ValidationGroup"] = value; } } #endregion } }
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Nella stessa categoria
- Kubernetes, gRPC e service mesh, il 28 dicembre 2020 alle 21:43
- Game of life in Angular.js, il 29 marzo 2016 alle 18:47
- ASP.NET e RabbitMQ (con un po' di Node.js), il 18 marzo 2016 alle 19:41
- Divide et impera con c# e un message broker, il 9 marzo 2016 alle 20:43
- Triplet class non è un oggetto curioso, è utilissimo!!!, il 12 settembre 2008 alle 13:11
I più letti del mese