RedirectToAction avec paramètre

597

J'ai une action que j'appelle d'une ancre ainsi, Site/Controller/Action/IDIDest un int.

Plus tard, je dois rediriger vers cette même action à partir d'un contrôleur.

Existe-t-il un moyen intelligent de le faire? Actuellement, je planque IDdans tempdata, mais lorsque vous appuyez sur f5 pour actualiser à nouveau la page après le retour, les tempdata ont disparu et la page se bloque.

Eric Brown - Cal
la source

Réponses:

947

Vous pouvez transmettre l'id dans le cadre du paramètre routeValues ​​de la méthode RedirectToAction ().

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

Cela entraînera une redirection vers Site / Controller / Action / 99. Pas besoin de données temporaires ou de tout type de vue.

Kurt Schindler
la source
2
Est-il possible de faire cela ou quelque chose de similaire, mais aussi de spécifier le contrôleur? (Je dois le faire d'un contrôleur à une action d'un autre contrôleur).
Diego
18
@Diego: oui, il y a quelques surcharges pour cela. Dans mon exemple, ce serait RedirectToAction ("Action", "Controller", new {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
Existe-t-il un moyen de faire la même chose mais de ne pas avoir la mise à jour d'URL comme ça?
Worthy7
@KurtSchindler Quoi qu'il en soit, pour mettre à jour votre réponse afin d'inclure votre exemple de commentaire d'une redirection vers un contrôleur différent? Pour aider ceux qui pourraient sauter la lecture des commentaires.
Edward
195

La réponse de Kurt devrait être juste, d'après mes recherches, mais quand je l'ai essayé, j'ai dû le faire pour que cela fonctionne réellement pour moi:

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

Si je n'ai pas spécifié le contrôleur et l'action dans RouteValueDictionarycela n'a pas fonctionné.

De plus, quand il est codé comme ceci, le premier paramètre (Action) semble être ignoré. Donc, si vous spécifiez simplement le contrôleur dans le Dict et que le premier paramètre spécifie l'action, cela ne fonctionne pas non plus.

Si vous venez plus tard, essayez d'abord la réponse de Kurt, et si vous avez encore des problèmes, essayez celle-ci.

Eric Brown - Cal
la source
6
Très bonne réponse. En outre, je pense que le controllerparamètre est facultatif si l'action de redirection se trouve dans le même contrôleur que l'action à partir de laquelle vous redirigez.
im1dermike
1
c'est censé être, mais quand je l'ai fait de cette façon, cela n'a pas fonctionné, j'ai dû ajouter explicitement le contrôleur ... c'était littéralement dans mes premiers jours de MVC, si je devais deviner maintenant, je dirais que je avait une sorte de problème de configuration de routage à examiner.
Eric Brown - Cal
Bizarre. Fonctionne pour moi dans MVC4.
im1dermike
Cela s'est produit dans les jours MVC1, et cela a bien fonctionné pour d'autres, c'est pourquoi je soupçonne un problème de configuration, avec le recul.
Eric Brown - Cal
@ EricBrown-Cal Compte tenu de votre propre soumission dans vos commentaires, ne pensez-vous pas que la réponse de Kurt est mieux adaptée à ceux qui recherchent une réponse au même problème que vous aviez à vos débuts?
Edward
62

RedirectToAction avec paramètre:

return RedirectToAction("Action","controller", new {@id=id});
kavitha Reddy
la source
1
Est-ce que ça marche? Je pense que c'est une syntaxe incorrecte. Corrige moi si je me trompe.
Mohammed Zameer
1
@ pb2q new {id = id}fonctionne aussi bien car le framework sait à quelle variable vous faites référence.
Edward
61

Il convient également de noter que vous pouvez passer par plus d'un paramètre. id sera utilisé pour constituer une partie de l'URL et tous les autres seront passés en tant que paramètres après un? dans l'url et sera UrlEncoded par défaut.

par exemple

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

L'URL serait donc:

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

Ceux-ci peuvent ensuite être référencés par votre contrôleur:

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

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

exemple

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

Exemple MVC 4 ...

Notez que vous n'avez pas toujours besoin de passer un paramètre nommé ID

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

Et,

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

Bien sûr, vous pouvez affecter une chaîne aux champs du modèle au lieu d'utiliser ViewBag si c'est votre préférence.

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

A travaillé pour moi, n'a pas eu besoin de le faire new{id = id}

Je redirigeais vers le même contrôleur, donc je n'avais pas besoin de "Controller"mais je ne suis pas sûr de la logique spécifique derrière quand le contrôleur est requis en tant que paramètre.

Zaeem Q
la source
RedirectToAction("Action", "Controller", new { id = id});était exactement ce dont j'avais besoin dans mon application Core 3.1.
orangecaterpillar
18

Si quelqu'un souhaite afficher un message d'erreur, [httppost]il peut essayer de transmettre un ID en utilisant

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

pour des détails comme celui-ci

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

J'espère que cela fonctionne bien.

Toriq Sagor
la source
16

....

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

....

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

J'ai également eu ce problème, et une très bonne façon de le faire si vous êtes dans le même contrôleur est d'utiliser des paramètres nommés:

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

Cela peut être il y a des années, mais de toute façon, cela dépend également de votre itinéraire de carte Global.asax puisque vous pouvez ajouter ou modifier des paramètres pour s'adapter à ce que vous voulez.

par exemple.

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

alors les paramètres que vous devrez passer changeront en:

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

Si vous avez besoin de rediriger vers une action en dehors du contrôleur, cela fonctionnera.

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

Ce qui suit a réussi avec asp.net core 2.1. Cela peut s'appliquer ailleurs. Le dictionnaire ControllerBase.ControllerContext.RouteData.Values ​​est directement accessible et accessible en écriture depuis la méthode d'action. C'est peut-être la destination ultime des données dans les autres solutions. Il montre également d'où proviennent les données de routage par défaut.

[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
la source