web-dev-qa-db-fra.com

RedirectToAction avec paramètre

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

Plus tard, je dois rediriger vers cette même action depuis un contrôleur.

Y a-t-il une façon intelligente de faire cela? Actuellement, je stocke ID dans tempdata, mais lorsque vous appuyez sur f5 pour actualiser la page une fois de retour, le tempdata a disparu et la page se bloque.

532
Eric Brown - Cal

réponse de Kurt devrait avoir raison, d'après mes recherches, mais lorsque j'ai essayé, je devais 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 la RouteValueDictionary cela n'a pas fonctionné.

De même, lorsque ce code est codé, le premier paramètre (Action) semble être ignoré. Donc, si vous spécifiez simplement le contrôleur dans Dict et attendez que le premier paramètre spécifie l'Action, cela ne fonctionnera pas non plus.

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

184
Eric Brown - Cal

Vous pouvez transmettre l'ID dans le 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 temp ou de tout type de données de vue.

874
Kurt Schindler

RedirectToAction avec le paramètre:

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

Il est également intéressant de noter que vous pouvez passer par plus d'un paramètre. id sera utilisé pour constituer une partie de l'URL et les autres seront passés comme 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" 
       });

Donc, l'URL serait:

    /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
          }
52
CF5

MVC 4 exemple ...

Notez que vous ne devez pas toujours passer le 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 à des champs de modèle au lieu d'utiliser ViewBag si tel est votre préférence.

39
Rohit
//How to use RedirectToAction in MVC

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

exemple

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

Si votre paramètre est un objet complexe, ceci résout le problème . La clé est le constructeur RouteValueDictionary.

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

Si vous avez des collections, cela rend les choses un peu plus compliquées, mais cette autre réponse couvre très bien cela .

22
mateuscb

Si on veut afficher un message d'erreur pour [httppost], il peut alors essayer en passant un ID avec

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 ça fonctionne bien.

17
Toriq Sagor

....

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

....

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

J'ai eu ce problème aussi, et une 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 });
14
Charles Philip

Cela peut être il y a des années, mais de toute façon, cela dépend également de votre itinéraire cartographique Global.asax, car vous pouvez ajouter ou modifier des paramètres à votre convenance.

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 aurez besoin de passer deviendront:

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

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

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
6
chr.solr
RedirectToAction("Action", "Controller" ,new { id });

Travaillé pour moi, pas besoin de faire new{id = id}

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

4
Zaeem Q

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 action. C’est peut-être la destination finale des données dans les autres solutions. Il indique é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
}
1
mikemay