J'ai ainsi une action que j'appelle d'une ancre, Site/Controller/Action/ID
où ID
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.
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.
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.
RedirectToAction
avec le paramètre:
return RedirectToAction("Action","controller", new {@id=id});
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
}
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.
//How to use RedirectToAction in MVC
return RedirectToAction("actionName", "ControllerName", routevalue);
return RedirectToAction("Index", "Home", new { id = 2});
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 .
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.
....
int parameter = Convert.ToInt32(Session["Id"].ToString());
....
return RedirectToAction("ActionName", new { Id = parameter });
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 });
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 } ) );
Si votre besoin de rediriger vers une action en dehors du contrôleur, cela fonctionnera.
return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
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.
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
}