Saltar al contenido

Pasar datos entre diferentes métodos de acción del controlador

este problema se puede resolver de diferentes formas, pero te enseñamos la que en nuestra opinión es la resolución más completa.

Solución:

HTTP y redirecciones

Primero recapitulemos cómo funciona ASP.NET MVC:

  1. Cuando llega una solicitud HTTP, se compara con un conjunto de rutas. Si una ruta coincide con la solicitud, se invocará la acción del controlador correspondiente a la ruta.
  2. Antes de invocar el método de acción, ASP.NET MVC realiza el enlace de modelos. El enlace de modelos es el proceso de mapear el contenido de la solicitud HTTP, que es básicamente solo texto, a los argumentos fuertemente tipados de su método de acción.

También recordemos qué es una redirección:

Una redirección HTTP es una respuesta que el servidor web puede enviar al cliente, diciéndole que busque el contenido solicitado en una URL diferente. La nueva URL está contenida en un Location encabezado que el servidor web devuelve al cliente. En ASP.NET MVC, realiza una redirección HTTP devolviendo un RedirectResult de una acción.

Pasando datos

Si solo estuviera pasando valores simples como cadenas y/o números enteros, podría pasarlos como parámetros de consulta en la URL en el Location encabezamiento. Esto es lo que pasaría si usaras algo como

return RedirectToAction("ActionName", "Controller", new  arg = updatedResultsDocument );

como otros han sugerido

La razón por la que esto no funcionará es que el XDocument es un objeto potencialmente muy complejo. No existe una forma directa para que el marco ASP.NET MVC serialice el documento en algo que se ajuste a una URL y luego modele el enlace desde el valor de la URL de vuelta a su XDocument parámetro de acción.

En general, pasar el documento al cliente para que el cliente lo devuelva al servidor en la próxima solicitud es un procedimiento muy frágil: requeriría todo tipo de serialización y deserialización y todo tipo de cosas podrían salir mal. Si el documento es grande, también podría ser una pérdida sustancial de ancho de banda y podría afectar gravemente el rendimiento de su aplicación.

En cambio, lo que desea hacer es mantener el documento en el servidor y devolver un identificador al cliente. Luego, el cliente pasa el identificador junto con la siguiente solicitud y el servidor recupera el documento utilizando este identificador.

Almacenamiento de datos para recuperarlos en la siguiente solicitud

Entonces, la pregunta ahora es, ¿dónde almacena el servidor el documento mientras tanto? Bueno, eso es para que usted decida y la mejor opción dependerá de su escenario particular. Si este documento debe estar disponible a largo plazo, es posible que desee almacenarlo en un disco o en una base de datos. Si contiene solo información transitoria, manteniéndola en la memoria del servidor web, en el caché de ASP.NET o en el Session (o TempDataque es más o menos lo mismo que el Session al final) puede ser la solución correcta. De cualquier manera, usted almacena el documento bajo un key que le permitirá recuperar el documento más tarde:

int documentId = _myDocumentRepository.Save(updatedResultsDocument);

y luego lo devuelves key al cliente:

return RedirectToAction("UpdateConfirmation", "ApplicationPoolController ", new  id = documentId );

Cuando desee recuperar el documento, simplemente búsquelo en función de la key:

 public ActionResult UpdateConfirmation(int id)
 
      XDocument doc = _myDocumentRepository.GetById(id);

      ConfirmationModel model = new ConfirmationModel(doc);

      return View(model);
 

¿Has intentado usar ASP.NET MVC TempData?

El diccionario ASP.NET MVC TempData se utiliza para compartir datos entre las acciones del controlador. El valor de TempData persiste hasta que se lee o hasta que se agota el tiempo de sesión del usuario actual. Los datos persistentes en TempData son útiles en escenarios como la redirección, cuando se necesitan valores más allá de una sola solicitud.

El código sería algo como esto:

[HttpPost]
public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel)

    XDocument updatedResultsDocument = myService.UpdateApplicationPools();
    TempData["doc"] = updatedResultsDocument;
    return RedirectToAction("UpdateConfirmation");

Y en el ApplicationPoolController:

public ActionResult UpdateConfirmation()

    if (TempData["doc"] != null)
    
        XDocument updatedResultsDocument = (XDocument) TempData["doc"];
            ...
        return View();
    

Personalmente yo no Me gusta usar TempData, pero prefiero pasar un objeto fuertemente tipado como se explica en Pasar información entre controladores en ASP.Net-MVC.

Siempre debe encontrar una manera de hacerlo explícito y esperado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *