asp.net-mvc - example - return redirect mvc 5
Redirigir a la acción y necesidad de pasar datos (2)
EDITAR: Lo siento, originalmente no vi su nota acerca de no querer usar TempData.
En pocas palabras, ¿desea que su mensaje vuelva a aparecer si el cliente actualiza / recarga la página a la que se redirigió?
Si lo haces, utiliza la cadena de consulta, algo así como:
return(RedirectToAction("Index", new { message = "hi there!" }));
y luego definir
public ActionResult Index(string message) { }
o expulse explícitamente Request.QueryString ["mensaje"] y páselo a View vía ViewData de la manera habitual. Esto también funcionará en los navegadores que no aceptan cookies de su sitio.
Si NO desea que el mensaje se muestre nuevamente, entonces ASP.NET MVC 1.0 proporciona la colección TempData para este propósito exacto.
Los valores de las propiedades TempData se almacenan en estado de sesión hasta la próxima solicitud desde el mismo navegador , después de lo cual se borran, por lo que si coloca algo en TempData inmediatamente antes de devolver RedirectToAction, estará disponible en el resultado de la redirección pero se borrará inmediatamente después.
Aquí hay un cambio simple al HomeController en el proyecto de inicio ASP.NET MVC:
public ActionResult Index() {
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(string submitButton) {
TempData["message"] = "You clicked " + submitButton;
return(RedirectToAction("Index"));
}
public ActionResult About() {
return View();
}
y la vista correspondiente /Views/Home/Index.aspx debería contener algo como esto:
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<% if (TempData["message"] != null) { %>
<p><%= Html.Encode(TempData["message"]) %></p>
<% } %>
<% using (Html.BeginForm()) { %>
<input type="submit" name="submitButton" value="Button One" />
<input type="submit" name="submitButton" value="Button Two" />
<% } %>
</asp:Content>
Notará que el mensaje TempData se muestra inmediatamente después de una secuencia POST-REDIRECT-GET, pero si actualiza la página, no se volverá a mostrar.
Tenga en cuenta que este comportamiento ha cambiado en ASP.NET MVC 2; consulte "Pasar el estado entre los métodos de acción" en este artículo para obtener más información.
Tengo un controlador que maneja tres acciones que son específicas de mi problema.
La primera es la acción de edición que devuelve una vista con un formulario HTML que el usuario puede editar las propiedades en el elemento dado.
El segundo es la acción de actualización que acepta la publicación posterior del navegador y actualiza la base de datos. Cuando la actualización es exitosa hacemos un redireccionamiento a la acción.
El tercero es la acción de mostrar que muestra los detalles del artículo dado. Esta acción es donde nos redireccionan después de una actualización exitosa.
El flujo es:
Mostrar -> Editar -> Actualizar (Suceso: y -> redirigir a Mostrar, n -> regresar Editar)
Lo que quiero lograr es tener una bandera disparada cuando la actualización fue exitosa para que en la próxima vista Mostrar pueda mostrar un mensaje de confirmación para el usuario. El problema es que no estoy 100% seguro de la mejor manera de llevar esos datos a través de la llamada RedirectToAction (). ¿Un pensamiento que tuve fue utilizar una cadena de consulta? Ya estamos llevando variables con la cadena de consulta para otro propósito pero parte de mi es escéptico para abusar de eso. La llamada a la redirección está a continuación.
RouteValueDictionary dict = Foo.GetRouteValues(bar);
RedirectToAction("Show", dict);
He leído esta pregunta también, pero estoy preocupado sobre el uso de la propiedad TempData si no es necesario.
Gracias por algunas sugerencias!
Nunca TempData
sido fanático de TempData
tampoco y, además, no quería pasar la bandera de éxito en la URL ya que no quería ver
Aplicación / Configuración? SaveSuccess = true
en la barra de URL del navegador.
Mi solución usa una cookie temporal:
[HttpPost]
public ActionResult Settings(SettingsViewModel view)
{
if (ModelState.IsValid)
{
//save
Response.SetCookie(new HttpCookie("SettingsSaveSuccess", ""));
return RedirectToAction("Settings");
}
else
{
return View(view);
}
}
y en la acción de verificación correspondiente, compruebe la presencia de esta Cookie y elimínela:
[HttpGet]
public ActionResult Settings()
{
var view = new SettingsViewModel();
//fetch from db and do your mapping
bool saveSuccess = false;
if (Request.Cookies["SettingsSaveSuccess"] != null)
{
Response.SetCookie(new HttpCookie("SettingsSaveSuccess", "") { Expires = DateTime.Now.AddDays(-1) });
saveSuccess = true;
}
view.SaveSuccess = saveSuccess;
return View(view);
}
nb esto puede ser una pendiente bastante deslizante si comienzas a pasar algo más complejo que una bandera booleana