Programming Languages Hacks

Importanti regole per linguaggi di programmazione rilevanti come Java, C, C++, C#…

  • Subscribe

  • Lettori

    I miei lettori abituali

  • Twitter

WebControl Sempre Abilitati

Posted by Ricibald on 6th February 2009

Il problema è questo: devo creare un LinkButton che sia sempre Enabled. Ma se un suo contenitore (ad esempio un Panel) è disabilitato, allora il LinkButton nel rendering va ad impostare la proprietà disabled navigando tra i padri.

Sarebbe bello se riuscissimo a modificare il comportamento dei WebControl per non rilevare disabled in uno dei padri. La soluzione sta nell’impedire che il nostro controllo figlio (ad esempio il nostro LinkButton) faccia uso di alcune funzionalità ereditate dalla classe base WebControl.

Ricerche su Internet non sono servite. Ho cercato come è implementato il WebControl ispezionando il codice sorgente di WebControl di Mono e il codice sorgente di LinkButton.

Il risultato è di seguito:

    public class LinkButtonSmartAlwaysEnabled : LinkButton
    {
        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            //base.AddAttributesToRender(writer);
            if (ID != null)
                writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID);

            if (AccessKey != string.Empty)
                writer.AddAttribute(HtmlTextWriterAttribute.Accesskey, AccessKey);

            //if (!enabled)
            //    writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");

            if (ToolTip != string.Empty)
                writer.AddAttribute(HtmlTextWriterAttribute.Title, ToolTip);

            if (TabIndex != 0)
                writer.AddAttribute(HtmlTextWriterAttribute.Tabindex, TabIndex.ToString());

            if (Enabled && Page != null)
            {
                string href = Page.ClientScript.GetPostBackClientHyperlink(this, "");
                writer.AddAttribute(HtmlTextWriterAttribute.Href, href);
            }

            if (this.Attributes != null)
                foreach (string s in this.Attributes.Keys)
                    writer.AddAttribute(s, this.Attributes[s]);
        }
    }

Posted in .net | 1 Comment »

Clear dei Web Control in .NET

Posted by Ricibald on 12th January 2008

Nelle pagine web si ha spesso l’esigenza di resettare il contenuto dei controlli a seguito della pressione di un pulsante.

Si immagini ad esempio una pagina di inserimento di un post in un blog. Dopo aver aggiunto correttamente la pagina nel blog si vuole ricevere la stessa pagina di composizione ma resettata di tutti i campi (come in WordPress).

In .NET per ottenere questo comportamento abbiamo diverse tecniche, che hanno però inconvenienti:

  • disabilitare il ViewState dai controlli
    • il ViewState non viene però conservato in caso di PostBack differenti, come errori nell’inserimento della pagina
  • resettare i controlli nel Page_Load, nel caso IsPostBack vale true
    • i controlli vengono però resettati per ogni PostBack, non per quello specifico del pulsante
    • è necessario resettare manualmente tutti i controll, che potrebbe essere un lavoro con errori di consistenza (come tutti i lavori “copia e incolla”)
  • resettare i controlli nel gestore del click del pulsante
    • è necessario resettare manualmente tutti i controll, che potrebbe essere un lavoro con errori di consistenza (come tutti i lavori “copia e incolla”)
  • eseguire il Response.Redirect verso sé stesso nel gestore del click del pulsante
    • perdo i valori di tutti i controlli: non posso selezionare quali controlli viceversa mantenere
    • si possono passare eventuali valori tramite QueryString:
      Response.Redirect(Request.Url.GetLeftPart(UriPartial.Path) + "?message="+messaggio);
  • eseguire il Server.Transfer verso sé stesso nel gestore del click del pulsante
    • perdo i valori di tutti i controlli: non posso selezionare quali controlli viceversa mantenere
    • si possono passare eventuali valori tramite CrossPagePostback

La tecnica migliore è senza dubbio l’ultima. Come al solito, non so se questa sia la tecnica migliore: sono più che curioso di scoprire se ci sono tecniche che non ho considerato…

Posted in .net | No Comments »