Blog

UrlRewrite e Postback: il problema sull'action del form in asp.net


Sperimentando l'UrlRewrite in un sito .net ci si scontra con un errore sui postback. Vediamo come risolverlo
L'UrlReWrite è la tecnica di riscrivere gli indirizzi in un sito, in modo da rendere quest'ultimo più "amichevole" per un motore di ricerca. Come è noto nei siti dinamici, i contenuti e quindi le pagine non sono fatte a priori, ma generate a partire da un database. Come avviene su questo sito. Da qualche giorno abbiamo fatto anche noi la transizione all'UrlRewrite.

Nel primo mese di vita tutti le pagine erano richiamate tramite un parametro in query string. Ad esempio chiamando l'indirizzo /blog.aspx?id=50, dove id=50 rappresenta il numero di record da richiamare dal database. Con l'UrlRewrite l'indirizzo diventa /blog/50/microsoft-windows-server-e-zend-server-angeli-e-demoni-insieme.aspx sicuramente più lungo ma meno criptico. 

Che vantaggi ci porta? Primo fra tutti, quando distribuiamo il link, già da questo è possibile sapere quale sarà il contenuto dell'articolo, essendo presente il titolo già nell'url. Dal punto di vista dei motori di ricerca, abbiamo la possibilità di indicizzare più pagine perchè molti motori di ricerca minori ignorano i parametri delle pagine, mentre i maggiori, che sono in grado di leggerli, così possono indicizzare come parole chiave anche il testo nell'url.

Se andate ad implementare una delle tecniche per fare l'UrlReWrite, che sia con gli httphandler o con gli httpmodule, vi accorgete di un problema. Non funziona più il postback delle pagine. Quello che succede è che l'attributo action all'interno del tag form, che nel modello delle pagine di asp.net è autogenerato, continua a puntare all'url non riscritta.

La soluzione più facile per ovviare a questo problema è scrivere nel Page_Load delle pagine (meglio ancora ereditare tutte le pagine da una pagina base ed inserire il seguente codice nella Page_Load della pagina base) il seguente codice:

HttpContext.Current.RewritePath(HttpContext.Current.Request.RawUrl); //c#

HttpContext.Current.RewritePath(HttpContext.Current.Request.RawUrl) 'VB.net

Se usate asp.net Ajax, con questa tecnica avrete qualche problemino con gli extender, in tal caso non va bene come soluzione e dovrete implementarne una un pochino più sofisticata. Che sarà argomento di un futuro post.


Post correlati:

Copyrights © 2011-2024 Tutti i diritti riservati - by Ideativi Srl