HttpModule di ASP.NET per esempi

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Applicare un tema alla pagina

ASP.NET 2.0 ha introdotto i temi che sono utili per dare una visione differente dello stesso sito. Per modificare la skin di una pagina, il meccanismo è alquanto semplice; basta infatti intervenire nell'evento Pre_Init (o in uno di quelli precedenti della pipeline) per impostare il nuovo valore. Visto che da un HttpModule si possono intercettare solo eventi della pipeline di ASP.NET e non della pagina, si può intervenire nell'evento PreRequestHandlerExecute ed impostare li il tema. Non solo, ricorrendo al profilo, si può anche rendere persistente la scelta dell'utente.

public class SkinModule : IHttpModule
{
  public void Dispose()
  {
  }

  public void Init(HttpApplication context)
  {
    context.PreRequestHandlerExecute +=
      new EventHandler(context_PreRequestHandlerExecute);
  }

  void context_PreRequestHandlerExecute(object sender, EventArgs e)
  {
    if (!String.IsNullOrEmpty(
      System.Web.HttpContext.Current.Request.QueryString["skin"])
    {
      System.Web.HttpContext.Current.Profile["SKIN"] =
        System.Web.HttpContext.Current.Request.QueryString["skin"];
    }

    if (System.Web.HttpContext.Current.Profile["SKIN"] != null &&
      System.Web.HttpContext.Current.Profile["SKIN"].ToString() != String.Empty)
    {
      Page page = System.Web.HttpContext.Current.Handler as Page;
      if (page != null)
        page.Theme =
          System.Web.HttpContext.Current.Profile["SKIN"].ToString();
    }
  }
}

Nel gestore dell'evento, se nella QueryString esiste il parametro skin, allora questo viene salvato nel profilo dell'utente. Successivamente, se nel profilo la skin è presente, allora viene castato l'handler corrente a Page ed impostato il tema della pagina sul valore del profilo.

Validazione della QueryString

Una delle operazioni più tediose del web è validare i parametri di una pagina. Questo processo è molto spesso frutto di codice ripetuto e di sindrome da copia/incolla. Anche in questo caso, può essere utilizzato un HttpModule per validare i dati senza ricorrere a ripetezioni di codice.

Questa tecnica in realtà fa uso anche di altre feature di ASP.NET e, più in generale, del .NET Framework. Ma la parte fondamentale che mette in azione il tutto è racchiusa in un HttpModule. Quando si deve compiere un'operazione più volte all'interno di un'applicazione, il primo step è cercare di racchiudere il codice in classi ed utilizzare queste, ma ciò siginifica scrivere comunque codice. Per superare quest'ostacolo si può pensare di decorare la classe utilizzata con un attributo così da specificare che determinato codice deve essere eseguito. In questo modo si risparmia tempo e quello che si scrive non è propriamente codice, ma solo attributi di configurazione della classe.

Seguendo questa logica, si possono marcare le pagine con attributi personalizzati di modo da specificare quali siano i dati nella QueryString da validare, che tipo di validazione effettuare (obbligatorietà, formale, ecc.) e che azione intraprendere a fronte di un'errore dei dati. Quando si esegue la richiesta della pagina, un HttpModule ne estrae gli attributi e ne esegue la validazione in base ad essi.

Per cominciare si parte dall'attributo che specifica che dato validare e che tipo di validazione effettuare.

[AttributeUsage(AttributeTargets.Class, Inherited=true, AllowMultiple=true)]
public sealed class RequiredQueryStringValidatorAttribute :
  BaseQueryStringValidatorAttribute
{
  public RequiredQueryStringValidatorAttribute(
    string key, bool throwExceptionOnError) :
    base(key, throwExceptionOnError)
  {
  }

  public override string ErrorMessage
  {
    get { return "Value cannot be null or empty"; }
  }

  public override bool EvaluateIsValid()
  {
    return (!String.IsNullOrEmpty(
      System.Web.HttpContext.Current.Request[Key]));
  }
}

Per creare un'attributo si deve derivare, direttamente o indirettamente, dalla classe Attribute. Nel caso specifico Attribute è la classe da cui eredita BaseQueryStringValidator che a sua volta funge da classe base per l'attributo appena visto. Questa classe base è astratta ed obbliga quelle che ereditano da essa ad implementare il metodo EvaluateIsValid. Come si intuisce dal nome e dal codice, la classe appena vista effettua un controllo di obbligatorietà sulla chiave della QueryString che viene passata nel costruttore. Sfruttando la classe base BaseQueryStringValidator ed implementando opportunamente il metodo EvaluateIsValid, si può creare un attributo per ogni tipologia di controllo che si vuole effettuare. Per completezza, il secondo parametro del costruttore specifica se sollevare un'eccezione o solo inserire un dato nel dizionario Context.Items per evidenziare che c'è stato un errore di validazione.

A questo punto si passa alla stesura della pagina ed all'inserimento dei controlli sulla QueryString.

[RequiredQueryStringValidator("Chiave", true)]
public partial class DefaultPage : Page
{
  // ...
}

Quando la pagina viene richiamata, l'HttpModule verifica che il campo "chiave" sia presente nella QueryString e che sia valorizzato, in caso negativo solleva un'eccezione.

L'ultimo step è la creazione dell'HttpModule.

public class QueryStringValidatorModule : System.Web.IHttpModule
{
  public void Dispose()
  {
  }

  public void Init(System.Web.HttpApplication context)
  {
    context.PreRequestHandlerExecute += new EventHandler(context_BeginRequest);
  }

  void context_BeginRequest(object sender, EventArgs e)
  {
    QueryStringValidatorUtility.Validate();
  }
}

public static class QueryStringValidatorUtility
{
  public static bool Validate()
  {
    if (HttpContext.Current.Handler != null)
    {
      IHttpHandler handler = HttpContext.Current.Handler;

      foreach (BaseQueryStringValidatorAttribute attr in
        handler.GetType().GetCustomAttributes(
        typeof(BaseQueryStringValidatorAttribute), true))
      {
        if (!attr.EvaluateIsValid())
        {
          HttpContext.Current.Items.Add("__QUERYSTRINGVALIDATION",
            false);
          if (attr.ThrowExceptionOnError)
            throw new ArgumentException(attr.ErrorMessage, attr.Key);
          return false;
        }
      }
    }

    HttpContext.Current.Items.Add("__QUERYSTRINGVALIDATION", true);
    return true;
  }
}

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC