c# - net - MVC-Pasar datos con RedirectToAction()
return redirect mvc 5 (8)
¿No puedes hacer 2 resultados de acción con el mismo nombre y marcar 1 de ellos con HttpPost?
public ActionResult UpdateContent(FormCollection preview = null)
{
return View(preview);
}
[HttpPost]
public ActionResult UpdateContent(FormCollection collection = null, bool preview = false)
{
if (preview)
return UpdateContent(collection);
else
return UpdateContent(null);
}
Me gustaría tomar los datos ingresados en un formulario de usuario MVC y mostrarlos en una vista diferente.
La clase tiene la siguiente variable privada:
IList<string> _pagecontent = new List<string>();
La siguiente acción acepta un objeto FormCollection, lo valida y lo pasa a la vista "Vista previa" como una lista:
[Authorize(Roles = "Admins")]
[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateContent(FormCollection collection)
{
if (ModelState.IsValid)
{
string PageToInsert = collection["PageToInsert"];
string PageHeader = collection["PageHeader"];
string PageBody = collection["PageBody"];
//validate, excluded...
_pagecontent.Add(PageToInsert);
_pagecontent.Add(PageHeader);
_pagecontent.Add(PageBody);
}
return RedirectToAction("Preview", _pagecontent);
}
La vista previa tiene la siguiente directiva de página para pasar una lista de objetos fuertemente tipados:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Template.Master" Inherits="System.Web.Mvc.ViewPage<List<string>>" %>
Espero poder usar el objeto Modelo para obtener mis datos, pero lamentablemente no puedo. En la siguiente línea, obtengo una excepción de error index out of bounds
del índice, que indica que el índice debe ser no negativo y menor que el tamaño de la colección:
<% if (Model[0].ToString() == "0") { %>
Y algunos parámetros extraños se han agregado a la URL, ya que se resuelve en http://localhost:1894/Admin/Preview?Capacity=4&Count=3
Así que tengo dos preguntas:
- Cuando llamo a RedirectToAction y le paso mi lista, ¿por qué es inaccesible en el objeto Modelo de la vista?
- ¿Cuál es la forma correcta de hacer lo que estoy tratando de hacer, es decir, pasar una colección de cadenas a una vista para mostrarlas allí?
El problema con RedirectToAction es que está devolviendo un HTTP 302 y el navegador está en marcha y está realizando una nueva solicitud HTTP. Es posible que desee considerar el uso de una cookie y / o un objeto de sesión para conservar los datos entre las solicitudes.
El segundo parámetro de RedirectAction es routeValues, no model.
protected internal RedirectToRouteResult RedirectToAction(string actionName, object routeValues);
Trate de usar TempData para el modelo. Es para la persistencia de datos entre redirecciones.
Esto no funciona porque RedirectToAction en realidad está enviando de vuelta un Http 302 al navegador. Cuando el navegador recibe este 302, realiza una nueva solicitud al servidor solicitando la nueva página. Nueva solicitud, nuevas variables temporales.
También se enfrentará a este problema cuando intente guardar / editar / eliminar algo y, por algún motivo, lo niegue y tenga que devolver el formulario anterior nuevamente.
Entonces, en lugar de:
return RedirectToAction("Preview", _pagecontent);
Ponga la lógica de Vista previa en un método separado y simplemente llámelo:
return PreviewLogic(_pagecontent);
También puede usar el menú TempData [] dic para persistir los datos de la siguiente solicitud, como han dicho otros, pero luego no evitará el viaje de ida y vuelta 302 adicional al servidor.
Parece que estás buscando el comando UpdateModel:
Echa un vistazo a la publicación del blog de ScottGu sobre el tema:
Parece que estás tratando de hacer:
public ActionResult UpdateContent(FormCollection form) {
...
return View("Preview", _pagecontent);
}
Tenga en cuenta que se supone que una redirección es una "pizarra limpia" para el navegador (a excepción de cosas como la cookie de autenticación). No puede decirle al navegador que pase la información a la siguiente solicitud, ya que la próxima solicitud debe poder sostenerse por sí sola. Todo lo que tienes que hacer es decirle al navegador qué URL solicitar a continuación. En ASP.NET MVC, cuando pasa un objeto de argumentos a RedirectToAction
, las propiedades públicas de ese objeto se agregan como parámetros de cadena de consulta a la URL generada.
Tenga cuidado al usar TempData. Funciona muy bien en un entorno de servidor único, pero en un entorno de nube puede que no funcione como se espera, ya que no puede garantizar que la solicitud llegue a la misma máquina. Esto sucede porque TempData se basa en la sesión de asp.net. Pero si está utilizando otro administrador de sesión como SQL o AppFabric Cache, funcionará bien.
Trate de usar TempData. Es como un objeto de sesión de disparo único. Coloca los valores que desea en TempData, redirija inmediatamente y elimínelos. Hay una buena reseña aquí: http://blogs.teamb.com/craigstuntz/2009/01/23/37947/