Ich habe eine Aktion, die ich von einem Anker aus aufrufe, Site/Controller/Action/ID
wobei ID
ein int
ist.
Später muss ich von einem Controller zu derselben Aktion umleiten.
Gibt es eine clevere Möglichkeit, dies zu tun? Momentan habe ich ID
in tempdata gespeichert, aber wenn Sie f5 drücken, um die Seite nach dem Zurückgehen erneut zu aktualisieren, sind die tempdata weg und die Seite stürzt ab.
Kurts Antwort sollte nach meinen Recherchen stimmen, aber als ich es versuchte, musste ich Folgendes tun, damit es tatsächlich für mich funktioniert:
return RedirectToAction( "Main", new RouteValueDictionary(
new { controller = controllerName, action = "Main", Id = Id } ) );
Wenn ich den Controller und die Aktion in RouteValueDictionary
nicht angegeben habe, hat es nicht funktioniert.
Auch wenn der erste Parameter (Aktion) so codiert ist, scheint er ignoriert zu werden. Wenn Sie also nur den Controller im Dict angeben und erwarten, dass der erste Parameter die Aktion angibt, funktioniert dies ebenfalls nicht.
Wenn Sie später mitkommen, versuchen Sie zuerst Kurts Antwort, und wenn Sie immer noch Probleme haben, versuchen Sie diese.
Sie können die ID als Teil des routeValues-Parameters der RedirectToAction () -Methode übergeben.
return RedirectToAction("Action", new { id = 99 });
Dies führt zu einer Weiterleitung zu Site/Controller/Action/99. Keine Notwendigkeit für temporäre oder andere Anzeigedaten.
RedirectToAction
mit Parameter:
return RedirectToAction("Action","controller", new {@id=id});
Es ist auch erwähnenswert, dass Sie mehr als 1 Parameter durchlaufen können. id wird verwendet, um einen Teil der URL zu bilden, und alle anderen werden als Parameter nach einem? in der URL und wird standardmäßig mit UrlEncoded versehen.
z.B.
return RedirectToAction("ACTION", "CONTROLLER", new {
id = 99, otherParam = "Something", anotherParam = "OtherStuff"
});
Die URL wäre also:
/CONTROLLER/ACTION/99?otherParam=Something&anotherParam=OtherStuff
Diese können dann von Ihrem Controller referenziert werden:
public ActionResult ACTION(string id, string otherParam, string anotherParam) {
// Your code
}
MVC 4 Beispiel ...
Beachten Sie, dass Sie nicht immer den Parameter ID übergeben müssen
var message = model.UserName + " - thanks for taking yourtime to register on our glorious site. ";
return RedirectToAction("ThankYou", "Account", new { whatever = message });
Und,
public ActionResult ThankYou(string whatever) {
ViewBag.message = whatever;
return View();
}
Natürlich können Sie Modellfeldern Zeichenfolgen zuweisen, anstatt ViewBag zu verwenden, wenn dies Ihre Präferenz ist.
//How to use RedirectToAction in MVC
return RedirectToAction("actionName", "ControllerName", routevalue);
return RedirectToAction("Index", "Home", new { id = 2});
Wenn Ihr Parameter ein komplexes Objekt ist, dies löst das Problem . Der Schlüssel ist der Konstruktor RouteValueDictionary
.
return RedirectToAction("Action", new RouteValueDictionary(Model))
Wenn Sie zufällig Sammlungen haben, wird es etwas kniffliger aber diese andere Antwort deckt dies sehr gut ab .
Wenn jemand eine Fehlermeldung für [httppost]
anzeigen möchte, kann er/sie es versuchen, indem er eine ID übergibt
return RedirectToAction("LogIn", "Security", new { @errorId = 1 });
für Details wie dieses
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 });
}
}
Hoffe, es funktioniert gut.
....
int parameter = Convert.ToInt32(Session["Id"].ToString());
....
return RedirectToAction("ActionName", new { Id = parameter });
Ich hatte auch dieses Problem und es ist eine gute Möglichkeit, es zu tun, wenn Sie sich innerhalb desselben Controllers befinden, benannte Parameter zu verwenden:
return RedirectToAction(actionName: "Action", routeValues: new { id = 99 });
Dies könnte Jahre her sein, hängt jedoch auch von Ihrer Global.asax-Kartenroute ab, da Sie Parameter hinzufügen oder bearbeiten können, um sie Ihren Wünschen anzupassen.
z.B.
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
});
}
dann ändern sich die Parameter, die Sie übergeben müssen, zu:
return RedirectToAction( "Main", new RouteValueDictionary(
new { controller = controllerName, action = "Main", Id = Id, extraParam = someVariable } ) );
Wenn Sie zu einer Aktion außerhalb des Controllers umleiten müssen, funktioniert dies.
return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
RedirectToAction("Action", "Controller" ,new { id });
Arbeitete für mich, brauchte nicht zu tun new{id = id}
Ich habe innerhalb desselben Controllers umgeleitet, sodass ich den "Controller"
nicht benötigte, aber ich bin mir nicht sicher, welche Logik dahinter steckt, wenn der Controller als Parameter benötigt wird.
Folgendes gelang mit asp.net core 2.1. Es kann anderswo gelten. Das Wörterbuch ControllerBase.ControllerContext.RouteData.Values kann direkt aus der Aktionsmethode heraus aufgerufen und beschrieben werden. Möglicherweise ist dies das endgültige Ziel der Daten in den anderen Lösungen. Außerdem wird angezeigt, woher die Standardroutingdaten stammen.
[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
}