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.

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.


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.


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

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
          }

43
//How to use RedirectToAction in MVC

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

exemple

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

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.



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.


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.


16

....

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

....

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

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

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

7

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

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

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", "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/<whatever the email param says>
         // no need to specify the route part explicitly
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.