with net mvc c# asp.net-mvc controller redirecttoaction

c# - net - redirecttoaction with post parameters



RedirectToAction con parámetro (13)

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

Más adelante debo redirigir a esta misma acción desde un controlador.

¿Hay una manera inteligente de hacer esto? Actualmente estoy guardando ID en tempdata, pero cuando presionas f5 para actualizar la página nuevamente después de regresar, el tempdata desaparece y la página se bloquea.


....

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

....

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


Esto puede 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 desee.

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 }); }

entonces los parámetros que necesitarás pasar cambiarán a:

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


Lo siguiente tuvo éxito con el núcleo 2.1 de asp.net. Puede aplicarse en otros lugares. El diccionario ControllerBase.ControllerContext.RouteData.Values ​​es directamente accesible y se puede escribir desde el método de acción. Quizás este sea 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", "[email protected]"); return RedirectToAction(nameof(ToAction)); // will redirect to /to/[email protected] } [Route("/FromAnother/{email?}")]` public IActionResult FromAnotherAction(string email) { return RedirectToAction(nameof(ToAction)); // will redirect to /to/<whatever the email param says> // no need to specify the route part explicitly }


MVC 4 ejemplo ...

Tenga en cuenta que no siempre tiene que pasar el parámetro denominado 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.


Puede pasar el ID como parte del parámetro routeValues ​​del método RedirectToAction ().

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

Esto causará una redirección al Sitio / Controlador / Acción / 99. No hay necesidad de temp o cualquier tipo de datos de vista.


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

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


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

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

Si tienes colecciones, es un poco más complicado, pero esta otra respuesta cubre esto muy bien .


Si uno quiere mostrar un mensaje de error para [httppost] entonces él / ella puede intentar pasar 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 buena forma de hacerlo si está dentro del mismo controlador es usar parámetros con nombre:

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


También vale la pena señalar que puede pasar por más de 1 parámetro. id se utilizará para formar parte de la URL y cualquier otro se pasará como parámetros después de un? en la url y será UrlEncoded como predeterminado.

p.ej

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

Así que la url sería:

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

Estos pueden ser referenciados por su controlador:

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


RedirectToAction con parámetro:

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


La respuesta de Kurt debería ser correcta, según mi investigación, pero cuando la 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 especificé el controlador y la acción en RouteValueDictionary , no funcionó.

También cuando se codifica de esta manera, el primer parámetro (Acción) parece ser ignorado. Entonces, si solo especifica el controlador en el Dict, y espera que el primer parámetro especifique la Acción, tampoco funcionará.

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


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

ejemplo

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