2012-03-20 7 views
5

Ho una lista di azioniMVC3 Perché viene visualizzato l'errore "Azioni secondarie non è consentito eseguire azioni di reindirizzamento"?

//[HttpGet] (will come back to that!) 
    public ViewResult List(int page = 1) 
    { 
     //blah blah blah 
     return View(viewModel); 
    } 

A suo parere rendiamo azione:

@{   
    Html.RenderAction("UpdateSearch"); 
} 

definizioni di azione:

[ChildActionOnly] 
[HttpGet] 
public PartialViewResult UpdateSearch() 
{ 
    // do something and display a form in view 
    return PartialView(so); 
} 

[HttpPost] 
public RedirectToRouteResult UpdateSearch(Options searchOptions) 
{ 
    // do something and redirect to List 
    return RedirectToAction("List"); 
} 

e sto ottenendo: le azioni del bambino non sono autorizzati a eseguire eccezioni di azioni di reindirizzamento ogni volta che qualcuno invia il modulo. Sono nuovo di MVC3, ma sembra che il reindirizzamento sia anche un POST, perché se [HttpGet] sopra il metodo List è commentato "la risorsa non può essere trovata" accade.

Come cambio il metodo Http al reindirizzamento o sto facendo qualcosa di sbagliato? Ho provato a Bing, ma senza successo.

risposta

3

Le informazioni di reindirizzamento sono memorizzate nell'intestazione di risposta. Tuttavia, la risposta viene già inviata quando viene eseguita l'azione figlio in modo che le intestazioni non possano essere scritte.

In breve, non c'è modo di eseguire un reindirizzamento da azioni figlio se non attraverso l'uso di javascript sul lato client.

+0

Questo avrebbe senso, ma il reindirizzamento nel mio esempio non è fatto dal metodo con annotazioni [ChildActionOnly]. Il problema è che quando [HttpPost] UpdateSearch reindirizza a List, reindirizza con POST, quindi il metodo [HttpPost] è (cercando di essere) utilizzato per la generazione parziale in vista. Potrei usare RouteValueDictionary per cambiarlo? –

+0

Mostraci anche il contenuto della vista parziale. Il problema risiede probabilmente nella definizione della route sbagliata in BeginForm ma non posso dirlo senza vedere la vista. –

+2

Hai ragione. Per risolvere il problema, è sufficiente aggiungere il parametro azione per il metodo BeginForm in vista UpdateSearch (Get, versione Bambino) in modo un cambiamento da: /@ utilizzando (Html.BeginForm()) { a: /@ utilizzando (Html.BeginForm ("UpdateSearch")) { risolto il problema. Sei in grado di spiegare perché? –

Problemi correlati