Perché i risultati di reindirizzamento non sono consentiti in Azioni figlio in Asp.net MVC 2

Ho alcune azioni parziali che eseguo con il metodo Asp.Net Futures RenderAction. Alcuni di questi eseguono reindirizzamenti dopo che i moduli in essi contenuti sono stati elaborati.

Ora che ho eseguito l’aggiornamento a Asp.Net MVC 2 RC, mi viene visualizzato un messaggio di errore “Le azioni secondarie non sono consentite per eseguire azioni di reindirizzamento”.

Ho controllato il codice sorgente e ho trovato la linea che genera l’eccezione. Per aggirarlo posso creare un RedirectResult personalizzato, ma prima di farlo voglio capire perché il framework non lo consente in primo luogo. Ci deve essere una buona ragione e forse non dovrei neanche farlo.

Qualcuno sa il motivo di questa limitazione?

Grazie

    La limitazione esiste perché MVC ha già avviato il rendering di una vista sul client. L’effetto del reindirizzamento da questo punto non è definito. Potrebbe funzionare perfettamente, potrebbe continuare a rendere la vista originale senza reindirizzamento, potrebbe generare un’eccezione diversa, ecc.

    Poiché il risultato dell’esecuzione di questa azione non è definito, il framework lo blocca. In pratica, RenderAction non dovrebbe mai essere utilizzato per il rendering di qualcosa di diverso da una vista (o da un contenuto simile a una vista) per ragioni simili.

    Nel tuo caso particolare, l’azione esterna dovrebbe redirect. Se finirai per redirect da dentro la vista in ogni caso senza mostrare nulla all’utente, allora non c’era davvero alcuno scopo di passare attraverso la vista, in quanto l’azione esterna avrebbe potuto debind il lavoro in modo appropriato al suo proprio.

    Prova ad usare qualcosa di simile in Child Action:

    ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString()); 

    La mia soluzione

    Metodo di azione:

     return View("Redirect", model); 

    Vista:

      

    Nel mio caso, il modulo da sottoporre a rendering è un pannello “configura” su un’estensione di un sito Web che sto costruendo. Mi piacerebbe che il controller dell’estensione fosse in grado di gestire l’elaborazione dei moduli e quindi redirect nuovamente alla pagina di amministrazione elencando tutte le estensioni configurate. Non penso sia appropriato o pratico qui chiedere al controllore della pagina madre di elaborare il modulo per l’estensione. Cosa suggeriresti che io invece lo faccia?

    Nel mio caso insolito, avevo un AuthorizeAttribute personalizzato allegato ai miei controller che stava tentando di redirect su un’azione figlio, che non è consentito (come detto sopra).

    Per risolvere il problema, ho rimosso il controllo del reindirizzamento dell’authorization su tutte le azioni figlio:

     Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext) //Child actions cannot redirect anyway, so no need to check permissions. If filterContext.IsChildAction Then Exit Sub .. parent authorisation checks .. 

    A volte questo errore si verifica quando si tenta di eseguire il rendering di un’azione del risultato dell’azione di base. Esempio:

     ActionResult X Return View View X RenderAction Y ActionResult Y // Bla bla return View // else return RedirectToAction X 

    In tal caso, basta puntare l’url all’URL di submit del modulo di visualizzazione parziale che era l’objective del reindirizzamento problematico e lasciare che eseguisse il reindirizzamento stesso alla sua versione GET.