2011-09-29 24 views
16

Quiero pasar el objeto en RedirectToAction. Este es mi código:Pasando el objeto en RedirectToAction

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

donde searchJob es una instancia de SearchJob. Pero no obtengo datos sobre el método de acción SearchJob. En cambio, obtengo la cadena de consulta de searchJob = Entity.SearchJob. Por favor, ayúdame. ¿Qué estoy haciendo mal?

+1

¿Has mirado los documentos para 'RedirectToAction'? – bzlm

+0

¿Cuál es el controlador que tiene la acción SearchJob? ¿Es el mismo controlador? –

+0

No SearchJob es el controlador y tiene una acción llamada SearchJob. – Jaggu

Respuesta

28

No puede pasar clases a las acciones redirigidas de esa manera. La redirección se realiza por medio de url. Url es una cadena, por lo que no puede contener clases (seria objetos a url es realmente fuera de lógica aquí)

En su lugar, se puede utilizar TempData

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

y en acción reorientada

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

Después de ejecutar el código anterior, TempData ya no contendrá searchJob. TempData generalmente se usa para lectura única.

Pero no me gusta el camino de arriba. Si yo estuviera en su lugar, y quería buscar puestos de trabajo por su nombre, añadiría routeParameters como

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

y reciba para la acción a través del parámetro

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

De esta manera, se obtiene un mejor usuario y la URL amigable http y desde el punto de vista de Acción, obtendría todos los parámetros que necesita desde afuera. Esto es mejor para pruebas, mantenimiento, etc.

0

No puede pasar clases al método RedirectToAction, si desea pasar un objeto completo en una cadena de consulta o vía POST puede serializar el objeto utilizando XML o JSON y deserializar el objeto en el controlador del receptor. Si usa este enfoque, tenga cuidado con el tamaño del objeto serializado.

16

Usted puede tratar de:

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

pasando el objeto searchJob en el RouteValueDictionary constructor se descompone el objeto searchJob y pasar cada propiedad de la clase SearchJob como un valor de ruta de nivel superior.

con el aglutinante modelo por defecto, una acción define como:

public ActionResult SearchJob(SearchJob searchJob) 

recibirá un SearchJob objeto completamente re-hidratado.

+0

Realmente funciona para objetos simples. Pero los objetos anidados son nulos. Tendré que usar TempData en lugar de objetos complejos. – Sven

+0

@Sven ¿se llenan sus valores antes de pasar el objeto al constructor RouteValueDictionary? – Charlie

+0

Sí, el objeto está poblado antes. – Sven

Cuestiones relacionadas