2009-04-05 5 views
5

Así que si hago esto en el primer controlador:Al utilizar RedirectToAction, routeValue perder propiedades de referencia

public class AController:Controller 
    { 
      public ActionResult ActionOne() 
      { 
       MyObject myObj = new MyObject() 
       myObj.Name="Jeff Atwood"; 
       myObj.Age =60; 
       myObj.Address = new Address(40,"Street"); 

       return RedirectToAction("ActionTwo", "BController", myObj); 

      } 
    } 

En el segundo controlador, myObj va a salir bien, pero dirección será nulo.

public class BController:Controller 
     { 
       public ActionResult ActionOne(MyObject obj) 
       { 
        //obj.Address is null? 

       } 
     } 

¿Es esto como se esperaba? cualquier forma de evitarlo?

+0

estúpidos RouteValueDictionary: ¿Son MiObjeto una clase pública? Y los miembros, ¿son propiedades o campos? Utilizo este enfoque todo el tiempo sin ningún problema. –

Respuesta

1

La dirección es del tipo de referencia, creo que solo pueden pasar "String" y tipos de valores como int, float, etc. porque recuerdan que están pasando cadenas internamente desde el controlador a otro.

Puede ser que necesite implementar alguna interfaz de serialización para hacer esto (esto depende del modo de transferencia, xml, html o qué forma de transferencia se usa internamente).

8

Puede usar TempData para almacenar objetos que estarán disponibles entre dos solicitudes. Internamente, la implementación predeterminada usa la sesión.

public class AController:Controller 
{ 
    public ActionResult ActionOne() 
    { 
     MyObject myObj = new MyObject() 
     myObj.Name = "Jeff Atwood"; 
     myObj.Age = 60; 
     myObj.Address = new Address(40, "Street"); 
     TempData["myObj"] = myObj; 
     return RedirectToAction("ActionTwo", "BController"); 

    } 
} 

public class BController:Controller 
{ 
    public ActionResult ActionTwo() 
    { 
     MyObject myObj = TempData["myObj"] as MyObject; 
     // test if myObj is defined. If ActionTwo is invoked directly it could be null 
    } 
} 
0

He encontrado el mismo problema. La solución TempData no se ve muy bien porque dificulta las pruebas unitarias. ¿Es este un problema de serialización como señaló Akash?

2

Me encontré con este mismo problema, sin una solución obvia. Si bien TempData es muy útil, es bueno no tener que usarlo todo porque es bastante hackish.

la mejor solución que encontré fue la de aprobar una nueva pregunta

return RedirectToAction("ActionTwo", "BController", new { MyObject = myObj }); 
Cuestiones relacionadas