2011-03-23 17 views
10

Hola,Pase objeto complejo con redirección en ASP.NET MVC?

que tienen una acción que tiene este aspecto:

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Register(AdRegister adRegister, IEnumerable<HttpPostedFileBase> files) 

El AdRegister es una clase compleja y necesito pasar esto en un método de redirección más abajo en la acción de Registro, de esta manera:

return this.RedirectToAction("Validate", adRegister); 

La acción Validar se parece a esto:

public ActionResult Validate(AdRegister adRegister) 

Sé que puedo pasar parámetros simples, pero en este caso se trata de un objeto complejo. Este ejemplo no funciona, las propiedades del adRegister serán nulas.

¿Esto es posible y, de ser así, cómo?

BestRegards

Más información: acción Registro tomará la adRegister y hacer magia som en él, entonces serán enviados a la acción Validar. La acción Validar devolverá una página de validación al usuario. Cuando el usuario presiona el botón de otorgar, se completará el formulario de inscripción y se enviará a la publicación de vValidate donde se guardará. He buscado colocar el adRegister en el caché o la base de datos de forma temporal, pero será mejor si pudiera pasarlo a la siguiente acción.

Respuesta

17

Una posibilidad sería la de pasar las propiedades simples en la cadena de consulta:

return RedirectToAction(
    "Validate", 
    new { 
     foo = adRegister.Foo, 
     bar = adRegister.Bar, 
     ... and so on for all the properties you want to send 
    } 
); 

Otra posibilidad es almacenar en TempData (durante la vida útil de la redirección) o período de sesiones (durante la vida útil de la ASP sesión de .NET):

TempData["adRegister"] = adRegister; 
return RedirectToAction("Validate"); 

y luego recuperarlo desde TempData:

public ActionResult Validate() 
{ 
    adRegister = TempData["adRegister"] as AdRegister; 
    ... 
} 

Sin embargo, otra posibilidad (y la que yo le recomendaría) es persistir este objeto en el método POST en su almacén de datos:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Register(AdRegister adRegister, IEnumerable<HttpPostedFileBase> files) 
{ 
    ... 
    string id = Repository.Save(adRegister); 
    return RedirectToAction("Validate", new { id = adRegister.Id }); 
} 

y luego recogerlo en la tienda de datos después de redirigir:

public ActionResult Validate(string id) 
{ 
    AdRegister adRegister = Repository.Get(id); 
    ... 
} 
+0

De acuerdo, entonces no es posible enviar el objeto complejo directamente a la acción.El problema con TempData podría ser si el usuario actualiza la página. Maby la mejor manera es almacenarlo en la base de datos y luego ejecutar la limpieza con un intervalo establecido (El usuario podría llegar a la etapa 2 y luego abortar, de ser así, los datos seguirán estando en la base de datos). – Banshee

+0

Si abortan en todas las sesiones, creo que la base de datos es mejor ... –

+0

@SnowJim, sí, tiene razón acerca de que el usuario actualice la página. Es por eso que no te recomendaría que lo uses. La mejor manera es almacenarlo en la base de datos o sesión. –

1

una idea probablemente crearía una variable de sesión y pasaría una clave que hace referencia a esa variable de sesión si el objeto es requerido con algunas vistas?

+0

Sí, eso podría funcionar, el único problema es que si el usuario tarda mucho tiempo en enviar la página, es posible que la sesión ya se haya eliminado. Entonces sería mejor almacenarlo en la base de datos. Pero, una vez más, el tiempo de espera de la sesión podría establecerse en 60 minutos, eso debería ser suficiente. – Banshee

+0

Si este flujo de trabajo es algo específico, tomaría tanto tiempo y requeriría que la sesión se mantenga en vivo, mantener la sesión en vivo a través de una llamada ajax periódica sería mejor que establecer el tiempo de espera de la sesión ... –

1

Las tempdaciones de ASP.NET MVC deben ser perfectas para esto.

Dicho esto, TempData o sesión es una opción, pero tiene algunas desventajas como ser bastante viola y muchas veces turbia o difíciles de depurar. Lo que podría ser preferible es "esconder" el valor temporal en una tienda persistente, como el perfil del usuario o su propia base de datos, y luego pasar una clave a través del método de validación, que luego puede cargar los datos de dicha tienda. Esto también abre la posibilidad de recuperar carros abandonados y tal.

+0

aha Tengo un caché que Puedo configurar el cronómetro Pude almacenar el objeto en este caché y luego, cada vez que el usuario lo envía, actualiza el tiempo de espera a 60 minutos o algo así. Esto significa que no tendré que limpiar la base de datos manualmente y aún puedo recuperar datos si el usuario hace cosas raras como refrescar y cosas así. – Banshee

+0

Tenga cuidado: la caché ASP.NET es más violatoria que el almacenamiento de sesión en la mayoría de los casos. Es lo primero que se ataca cuando la memoria se agota. Usaría la sesión sobre la memoria caché para los datos del usuario. –

Cuestiones relacionadas