RedirectToAction con parámetro

Tengo una acción que llamo desde un ancla, Site/Controller/Action/ID donde ID es un int .

Más tarde, tengo que redirigir a esta misma acción desde un controlador.

¿Hay alguna manera inteligente de hacer esto? Actualmente estoy ocultando la ID en tempdata, pero cuando presionas f5 para actualizar la página nuevamente después de volver, la tempdata se ha ido y la página se cuelga.

Puede pasar la identificación como parte del parámetro routeValues ​​del método RedirectToAction ().

 return RedirectToAction("Action", new { id = 99 }); 

Esto causará una redirección a Sitio / Controlador / Acción / 99. No hay necesidad de datos temporales ni de ningún tipo de visualización.

La respuesta de Kurt debería ser la correcta, según mi investigación, pero cuando lo probé tuve que hacer esto para que realmente funcionara para mí:

 return RedirectToAction( "Main", new RouteValueDictionary( new { controller = controllerName, action = "Main", Id = Id } ) ); 

Si no especifiqué el controlador y la acción en el RouteValueDictionary , no funcionó.

También cuando se codifica así, el primer parámetro (Acción) parece ignorarse. Entonces, si solo especifica el controlador en el Dict, y espera que el primer parámetro especifique la Acción, tampoco funciona.

Si vienes más tarde, prueba la respuesta de Kurt primero, y si todavía tienes problemas prueba este.

RedirectToAction con parámetro:

 return RedirectToAction("Action","controller", new {@id=id}); 

MVC 4 ejemplo …

Tenga en cuenta que no siempre tiene que pasar un parámetro llamado ID

 var message = model.UserName + " - thanks for taking yourtime to register on our glorious site. "; return RedirectToAction("ThankYou", "Account", new { whatever = message }); 

Y,

 public ActionResult ThankYou(string whatever) { ViewBag.message = whatever; return View(); } 

Por supuesto, puede asignar una cadena a los campos del modelo en lugar de usar ViewBag si esa es su preferencia.

 //How to use RedirectToAction in MVC return RedirectToAction("actionName", "ControllerName", routevalue); 

ejemplo

 return RedirectToAction("Index", "Home", new { id = 2}); 

También vale la pena señalar que puede pasar más de 1 parámetro. id se usará para formar parte de la URL y cualquier otra se pasará como parámetros después de a? en la url y estará UrlEncoded como predeterminado.

p.ej

 return RedirectToAction("ACTION", "CONTROLLER", new { id = 99, otherParam = "Something", anotherParam = "OtherStuff" }); 

Entonces la url sería:

  /CONTROLLER/ACTION/99?otherParam=Something&anotherParam=OtherStuff 

A continuación, su controlador puede hacer referencia a estos:

 public ActionResult ACTION(string id, string otherParam, string anotherParam) { // Your code } 

Si su parámetro pasa a ser un objeto complejo, esto resuelve el problema . La clave es el constructor RouteValueDictionary .

 return RedirectToAction("Action", new RouteValueDictionary(Model)) 

Si tiene colecciones, lo hace un poco más complicado, pero esta otra respuesta lo cubre muy bien .

….

 int parameter = Convert.ToInt32(Session["Id"].ToString()); 

….

 return RedirectToAction("ActionName", new { Id = parameter }); 

Si uno quiere mostrar un mensaje de error para [httppost] entonces puede intentar pasando una identificación usando

 return RedirectToAction("LogIn", "Security", new { @errorId = 1 }); 

para detalles como este

  public ActionResult LogIn(int? errorId) { if (errorId > 0) { ViewBag.Error = "UserName Or Password Invalid !"; } return View(); } [Httppost] public ActionResult LogIn(FormCollection form) { string user= form["UserId"]; string password = form["Password"]; if (user == "admin" && password == "123") { return RedirectToAction("Index", "Admin"); } else { return RedirectToAction("LogIn", "Security", new { @errorId = 1 }); } } 

Espero que funcione bien

También tuve este problema, y ​​una forma bastante buena de hacerlo si estás dentro del mismo controlador es usar parámetros con nombre:

 return RedirectToAction(actionName: "Action", routeValues: new { id = 99 }); 

Esto podría ser hace años, pero de todos modos, esto también depende de su ruta de mapa Global.asax, ya que puede agregar o editar parámetros para que se ajusten a lo que desea.

p.ej.

Global.asax

  public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters //new { controller = "Home", action = "Index", id = UrlParameter.Optional new { controller = "Home", action = "Index", id = UrlParameter.Optional, extraParam = UrlParameter.Optional // extra parameter you might need }); } 

luego los parámetros que deberá pasar cambiarán a:

 return RedirectToAction( "Main", new RouteValueDictionary( new { controller = controllerName, action = "Main", Id = Id, extraParam = someVariable } ) ); 

Si necesita redireccionar a una acción fuera del controlador, esto funcionará.

 return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 }); 

Lo siguiente tuvo éxito con asp.net core 2.1. Puede aplicarse en otro lugar. El diccionario ControllerBase.ControllerContext.RouteData.Values ​​es directamente accesible y escribible desde el método de acción. Tal vez este es el destino final de los datos en las otras soluciones. También muestra de dónde provienen los datos de enrutamiento predeterminados.

 [Route("/to/{email?}")] public IActionResult ToAction(string email) { return View("To", email); } [Route("/from")] public IActionResult FromAction() { ControllerContext.RouteData.Values.Add("email", "mike@myemail.com"); return RedirectToAction(nameof(ToAction)); // will redirect to /to/mike@myemail.com } [Route("/FromAnother/{email?}")]` public IActionResult FromAnotherAction(string email) { return RedirectToAction(nameof(ToAction)); // will redirect to /to/ // no need to specify the route part explicitly }