Conservare l'URL riscritto nei PostBack con un control adapter per HtmlForm

di Daniele Bochicchio, in ASP.NET 2.0, Web Controls, Adaptive Rendering,

Uno dei problemi più comuni quando si fa Url Rewriting è che le pagine che fanno PostBack con buona probabilità faranno tornare l'URL quello originale.
Con ASP.NET 1.x c'è una tecnica particolare che consiste nell'usare una classe custom, derivata da HtmlForm, che non si comporti in questo modo. Sebbene questo trucco sia valido anche con ASP.NET 2.0, quest'ultimo ha un esteso meccanismo di adaptive rendering in grado di modificare l'output generato da un controllo senza che sia necessario cambiarne la defizione.

Per dotare la form di questa possibilità, è sufficiente creare un nuovo adapter come il suguente:

namespace ASPItalia.com.Web.UI.Adapters
{
  public class HtmlFormControlAdapter : ControlAdapter
  {
    protected override void Render(HtmlTextWriter writer)
    {
      // riassegno il textwriter
      base.Render(new UrlHtmlTextWriter(writer));
    }

  }
}

Come si può notare, per via della particolare comformazione della classe HtmlForm, è stato necessario creare una classe derivata da HtmlTextWriter, a cui rimandare la generazione dell'ouput, poichè altrimenti non è possibile intervenire sulla generazione degli attributi del tag form.

namespace ASPItalia.com.Web.UI
{
  public class UrlHtmlTextWriter : HtmlTextWriter
  {
    ...

    public override void WriteAttribute(string name, string value, bool fEncode)
    {
      // in RawUrl c'è sempre l'url che viene mostrato nella barra del browser
      // se il paramentro che sto scrivendo è action, allora lo reimposto
      if (name.ToLower() == "action")
        value = HttpContext.Current.Request.RawUrl;

      // richiamo l'implementazione di base
      base.WriteAttribute(name, value, fEncode);
    }
  }
}

Attraverso il metodo WriterAttribute viene riscritto il valore dell'attributo action, andandolo a leggere da Request.RawUrl, che contiene sempre il vero URL mostrato nella barra degli indirizzi del browser.

Successivamente è sufficiente creare la directory App_Browsers, direttamente sotto la root, ed aggiungere un file di definizioni come il seguente:

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
               adapterType="ASPItalia.com.Web.UI.Adapters.HtmlFormControlAdapter" />
    </controlAdapters>
  </browser>
</browsers>

Da questo momento ogni HtmlForm dell'applicazione emetterà questo tipo di output.
Questa tecnica, molto potente, può essere applicata praticamente a qualsiasi tipo di server control.
In allegato c'è un esempio completo di un piccolo modulo di Url Rewriter, per testare questa soluzione.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi