12 messaggi dal 04 dicembre 2009
Salve,

ho sviluppato un modulo http che permette di visualizzare una testata esterna in tutte le pagine di una determinata applicazione.

Questo modulo intercetta le chiamate verso le pagine aspx, e modificando l'oggetto request, inserisce il codice html generato dalla testata esterna, in testa alla pagina aspx richiamata.

Fin qui tutto ok.

Ho però un problema che si verifica se la pagina chiamata ha dei controlli Ajax al suo interno, ad esempio un Update Panel, si verifica il seguente errore:

Sys.WebForms.PageRequestManagerServerErrorException: Viewstate is invalid for this page

Riesco a ovviare a questo errore, se modifico la direttiva enableEventValidation a false, ma vorrei trovare una soluzione migliore.

Qualcuno ha avuto un problema simile?

Grazie, Domenico.
Come aggiungi questa testata esterna?

In generale, comunque, dovresti verificare che non stai eseguendo un AsyncPostback e, per farlo, potresti recuperare un'istanza dello ScriptManager corrente e interrogarne la proprietà IsInAsyncPostback.

Attenzione che:
1) Lo ScriptManager è disponibile solo dopo l'Init della pagina
2) Hai bisogno di un riferimento alla pagina corrente, che ad esempio puoi recuperare con
HttpContext.Current.Handler as Page

Ciao!
m.
12 messaggi dal 04 dicembre 2009
Innanzitutto grazie della risposta.

La testata viene aggiunta, prendendo l'html generato della testata esterna, che è una pagina aspx, e fondendolo alla pagina che ha scatenato la richiesta. La fusione delle due pagine viene messa nel HttpContext.Current.Response.Filter.

Nel modulo http già controllo che lo scatenante sia solo una pagina aspx, e non un asyncpostback, controllando che il ctx.Request.Headers["x-microsoftajax"] sia null e che lo scatenante non sia un axd.

Fatto ciò, il primo asynpostback va bene, appena faccio un secondo asynpostback, va in errore resource.axd sollevando l'eccezione sopracitata.
Uhm... ok, sembra che il tuo filtro "sminchi" il viewstate, ecco perchè il primo asyncpostback funziona e il secondo no.

Com'è fatto il tuo filtro? Riesci a postarmi un po' di codice?

Grazie mille,
m.
12 messaggi dal 04 dicembre 2009
Nel modulo Http faccio quanto segue:

private void Application_OnAfterProcess(Object o, EventArgs e)
{
 HttpContext ctx = HttpContext.Current;
 HttpApplication app = o as HttpApplication;
 long IdObject = -1;

 if (ctx.Request.Headers["x-microsoftajax"] == null)
  {
   Uri LocalUri = app.Request.Url;
   string LocalSegments = LocalUri.Segments[LocalUri.Segments.Length - 1];
   string LocalExt = System.IO.Path.GetExtension(LocalSegments);
                
   // Esclude le chiamate Ajax e i Web Services
   if (!(LocalExt == ".axd") && (!(LocalExt == ".asmx")))
    {
     // Include solo le pagine aspx, html, htm e asp
     if ((LocalExt == ".aspx") || (LocalExt == ".html") || (LocalExt == ".htm") || (LocalExt == ".asp"))
      {
       if (app.Request.QueryString["IdObject"] != null)
        {
          IdObject = Convert.ToInt64(app.Request.QueryString["IdObject"]);
          app.Session["IdObject"] = IdObject;
        }
        else if (app.Context.Session != null && app.Session["IdObject"] != null)
         IdObject = Convert.ToInt64(app.Session["IdObject"]);

         //Metodo che acquisisce l'html della testata e lo fonde con la pagina chiamante
         ModificaHtml mh = new ModificaHtml(ctx.Response.Filter, IdObject);
         ctx.Response.Filter = mh;
        }
       }
      }
     }
Sì, ok il modulo, ma io parlavo del filtro
m.
12 messaggi dal 04 dicembre 2009
Aspè... che filtro? La manipolazione della pagina viene fatta solo dal modulo.

Ti potrei allegare la pagina che viene generata, che mi sa che il casino è li, perché il risultato è una pagina con 2 form nel body. La prima form, che è quella della testata ha il viewstate vuoto, e la seconda form, ha il suo viewstate che non vado a toccare.

Potrebbe essere quello il problema?
Parlavo di questo
ModificaHtml mh = new ModificaHtml(ctx.Response.Filter, IdObject);
ctx.Response.Filter = mh;


Ma ora che mi hai spiegato meglio... beh, no, è errato il tuo modo di procedere: ad esempio.. tu mi dici che hai due hidden field, di cui uno vuoto, entrambi con ID="__VIEWSTATE"?

Se è così è normale che si arrabbi! Dovresti fare in modo che l'html che aggiungi sia "piano", senza viewstate o form runat="server".

Ripeto, secondo me sei sulla strada sbagliata: fossi in te utilizzerei un semplice iframe
m.
Modificato da Cradle il 02 dicembre 2010 13.04 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.