2011-09-29 22 views
16

Voglio passare l'oggetto in RedirectToAction. Questo è il mio codice:Passaggio dell'oggetto in RedirectToAction

RouteValueDictionary dict = new RouteValueDictionary(); 
      dict.Add("searchJob", searchJob); 
      return RedirectToAction("SearchJob", "SearchJob", dict); 

dove searchJob è l'istanza di SearchJob. Ma non ottengo dati sul metodo di azione di SearchJob. Invece ottengo querystring di searchJob = Entity.SearchJob. Mi aiuti per favore. Che cosa sto facendo di sbagliato?

+1

Hai visto i documenti per 'RedirectToAction'? – bzlm

+0

Qual è il controller con azione SearchJob? È lo stesso controller? –

+0

Nessun SearchJob è il controller e ha un'azione denominata SearchJob. – Jaggu

risposta

28

Non è possibile passare le classi alle azioni reindirizzate in questo modo. Il reindirizzamento avviene tramite l'url. Url è stringa, quindi non può contenere classi (serializzazione di oggetti a url è veramente fuori di logica qui)

Invece, è possibile utilizzare TempData

TempData["searchJob"] = searchJob; 
return RedirectToAction ...; 

e in un'azione riorientata

Entity.SearchJob = (Entity.SearchJob)TempData["searchJob"] ; 

Dopo aver eseguito il codice sopra, TempData non conterrà più searchJob. TempData è generalmente utilizzato per la lettura a tempo singolo.

Ma la via sopra non mi piace. Se fossi al tuo posto, e volevo cercare posti di lavoro in base al nome, vorrei aggiungere routeParameters come

RouteValueDictionary dict = new RouteValueDictionary(); 
dict.Add("searchJobName", searchJob.JobName); 

e ricevo per azione tramite il parametro

public ActionResult SearchJob(string searchJobName) 
{ 
... do something with name 
} 

In questo modo, si ottiene una migliore user e http friendly url e dal punto di vista Action, otterrebbe tutti i parametri necessari dall'esterno. Questo è meglio per test, manutenzione, ecc.

0

Non è possibile passare le classi al metodo RedirectToAction, se si desidera passare un intero oggetto in una querystring o tramite POST è possibile serializzare l'oggetto utilizzando XML o JSON e deserializzare l'oggetto nel controller ricevente. Se si utilizza questo approccio per fare attenzione alle dimensioni dell'oggetto serializzato.

16

Si potrebbe provare:

return RedirectToAction("SearchJob", "SearchJob", new RouteValueDictionary(searchJob) 

Passando l'oggetto searchJob nel costruttore RouteValueDictionary si decompongono l'oggetto searchJob e superare ogni proprietà della classe SearchJob come un valore percorso di alto livello.

Con il legante modello predefinito, un'azione definita come:

public ActionResult SearchJob(SearchJob searchJob) 

ricevere la completamente reidratati SearchJob oggetto.

+0

Funziona davvero per oggetti semplici. Ma gli oggetti nidificati sono nulli. Dovrò usare TempData invece per oggetti complessi. – Sven

+0

@Sven vengono popolati i valori prima di passare l'oggetto al costruttore RouteValueDictionary? – Charlie

+0

Sì, l'oggetto è stato compilato in precedenza. – Sven

Problemi correlati