RedirectToAction con parámetro

597

Por lo tanto, tengo una acción que llamo desde un ancla, Site/Controller/Action/IDdonde IDes un int.

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

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

Eric Brown - Cal
fuente

Respuestas:

947

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

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

Esto provocará una redirección al Sitio / Controlador / Acción / 99. No necesita datos temporales ni ningún tipo de vista.

Kurt Schindler
fuente
2
¿Hay alguna forma de hacer eso o algo similar pero también de especificar el controlador? (Necesito hacer eso de un controlador a una acción de otro controlador).
Diego
18
@ Diego: sí, hay un par de sobrecargas para eso. En mi ejemplo, sería RedirectToAction ("Acción", "Controlador", nuevo {id = 99}) msdn.microsoft.com/en-us/library/dd470154.aspx
Kurt Schindler
10
VB -Return RedirectToAction("Action", "Controller", New With {.id = 99})
Jeremy A. West
¿Hay alguna manera de hacer lo mismo pero no tener la actualización de la URL de esa manera?
Digno7
@KurtSchindler ¿De todos modos actualizar su respuesta para incluir su ejemplo de comentario de una redirección a un controlador diferente también? Para ayudar a aquellos que podrían pasar por alto la lectura de comentarios.
Edward
195

La respuesta de Kurt debería ser correcta, según mi investigación, pero cuando lo intenté, 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 RouteValueDictionaryno funcionó.

Además, 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 funcionará.

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

Eric Brown - Cal
fuente
66
Gran respuesta. Además, creo que el controllerparámetro es opcional si la acción de redireccionamiento está en el mismo controlador que la acción desde la que está redirigiendo.
im1dermike
1
se supone que debe ser, pero cuando lo hice de esa manera, no funcionó, tuve que agregar explícitamente el controlador ... eso fue literalmente en mis primeros días de MVC, si tuviera que adivinar ahora diría que tenía algún tipo de problema de configuración de enrutamiento para investigar.
Eric Brown - Cal
Extraño. Funciona para mí en MVC4.
im1dermike
Esto sucedió en los días de MVC1, y funcionó bien para otros, por eso sospecho un problema de configuración, mirando hacia atrás.
Eric Brown - Cal
@ EricBrown-Cal Dada incluso su propia presentación en sus comentarios, ¿no cree que la respuesta de Kurt es más adecuada para aquellos que buscan una respuesta al mismo problema que tuvieron en sus primeros días?
Edward
62

RedirectToAction con parámetro:

return RedirectToAction("Action","controller", new {@id=id});
kavitha Reddy
fuente
1
¿Funciona? Creo que esta es una sintaxis incorrecta. Corrígeme si estoy equivocado.
Mohammed Zameer
1
@ pb2q new {id = id}funciona igual de bien porque el marco de trabajo sabe a qué variable se refiere.
Edward
61

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

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

Estos pueden ser referenciados por su controlador:

public ActionResult ACTION(string id, string otherParam, string anotherParam) {
   // Your code
          }
CF5
fuente
43
//How to use RedirectToAction in MVC

return RedirectToAction("actionName", "ControllerName", routevalue);

ejemplo

return RedirectToAction("Index", "Home", new { id = 2});
Thivan Mydeen
fuente
39

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 cadenas a los campos del modelo en lugar de usar ViewBag si esa es su preferencia.

Rohit
fuente
21
RedirectToAction("Action", "Controller" ,new { id });

Trabajó para mí, no necesitaba hacer new{id = id}

Estaba redirigiendo dentro del mismo controlador, así que no necesitaba el "Controller"pero no estoy seguro de la lógica específica detrás cuando se requiere el controlador como parámetro.

Zaeem Q
fuente
RedirectToAction("Action", "Controller", new { id = id});era justo lo que necesitaba en mi aplicación Core 3.1.
orangecaterpillar
18

Si alguien quiere mostrar un mensaje de error [httppost], puede intentarlo pasando una ID 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.

Toriq Sagor
fuente
16

....

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

....

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

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

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

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 ajustarse 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 deberá pasar cambiarán a:

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

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

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
chr.solr
fuente
1

Lo siguiente tuvo éxito con asp.net core 2.1. Se puede aplicar en otro lugar. 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
}
mikemay
fuente