RedirectToAction mit Parameter

596

Ich habe eine Aktion, die ich so von einem Anker aus rufe, Site/Controller/Action/IDwo IDist eine int.

Später muss ich von einem Controller zu derselben Aktion umleiten.

Gibt es eine clevere Möglichkeit, dies zu tun? Momentan verstecke ich Tempdata ID, aber wenn Sie f5 drücken, um die Seite nach dem Zurückgehen erneut zu aktualisieren, sind die Tempdata verschwunden und die Seite stürzt ab.

Eric Brown - Cal
quelle

Antworten:

946

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 Umleitung zu Site / Controller / Action / 99. Keine Notwendigkeit für temporäre oder irgendeine Art von Ansichtsdaten.

Kurt Schindler
quelle
2
Gibt es sowieso etwas zu tun oder ähnliches, aber auch den Controller zu spezifizieren? (Ich muss das von einem Controller zu einer Aktion eines anderen Controllers machen).
Diego
18
@Diego: Ja, dafür gibt es ein paar Überladungen. In meinem Beispiel wäre es RedirectToAction ("Aktion", "Controller", neu {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
Gibt es eine Möglichkeit, dasselbe zu tun, aber das URL-Update nicht so zu haben?
Worthy7
@KurtSchindler Wie auch immer, um Ihre Antwort zu aktualisieren und Ihr Kommentarbeispiel für eine Weiterleitung an einen anderen Controller aufzunehmen? Um denjenigen zu helfen, die das Lesen von Kommentaren überspringen könnten.
Edward
194

Kurts Antwort sollte aus meiner Forschung heraus richtig sein, aber als ich es versuchte, musste ich dies 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 im nicht angegeben habe, hat RouteValueDictionaryes nicht funktioniert.

Auch wenn so codiert, scheint der erste Parameter (Aktion) 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 vorbeikommen, versuchen Sie zuerst Kurts Antwort, und wenn Sie immer noch Probleme haben, versuchen Sie diese.

Eric Brown - Cal
quelle
6
Gute Antwort. Ich glaube auch, dass der controllerParameter optional ist, wenn sich die Umleitungsaktion auf demselben Controller befindet wie die Aktion, von der Sie umleiten.
Im1dermike
1
es sollte sein, aber als ich es so gemacht habe, hat es nicht funktioniert, ich musste den Controller explizit hinzufügen ... das war buchstäblich in meinen ersten Tagen von MVC, wenn ich jetzt raten müsste, würde ich sagen, ich hatte eine Art von Routing-Setup-Problem zu untersuchen.
Eric Brown - Cal
Seltsam. Funktioniert für mich in MVC4.
Im1dermike
Dies geschah in MVC1-Tagen und es funktionierte gut für andere. Deshalb vermute ich im Rückblick ein Konfigurationsproblem.
Eric Brown - Cal
@ EricBrown-Cal Glaubst du nicht, dass Kurts Antwort besser für diejenigen geeignet ist, die eine Antwort auf das gleiche Problem suchen, das du in deinen ersten Tagen hattest?
Edward
62

RedirectToAction mit Parameter:

return RedirectToAction("Action","controller", new {@id=id});
Kavitha Reddy
quelle
1
Funktioniert es? Ich glaube, das ist eine falsche Syntax. Korrigiere mich, wenn ich falsch liege.
Mohammed Zameer
1
@ pb2q new {id = id}funktioniert genauso gut, da das Framework weiß, auf welche Variable Sie sich beziehen.
Edward
61

Es ist auch erwähnenswert, dass Sie mehr als einen Parameter durchlaufen können. Die ID wird verwendet, um einen Teil der URL zu bilden, und alle anderen werden nach einem? als Parameter übergeben. in der URL und wird standardmäßig UrlEncoded sein.

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
          }
CF5
quelle
43
//How to use RedirectToAction in MVC

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

Beispiel

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

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 Sie dies bevorzugen.

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

Arbeitete für mich, musste nicht tun new{id = id}

Ich habe innerhalb desselben Controllers umgeleitet, daher brauchte ich das nicht "Controller", bin mir aber nicht sicher, welche Logik dahinter steckt, wenn der Controller als Parameter benötigt wird.

Zaeem Q.
quelle
RedirectToAction("Action", "Controller", new { id = id});war genau das, was ich in meiner Core 3.1 App brauchte.
Orangecaterpillar
18

Wenn jemand eine Fehlermeldung anzeigen möchte, [httppost]kann er es versuchen, indem er eine ID mit übergibt

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

für Details wie diese

 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.

Toriq Sagor
quelle
16

....

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

....

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

Ich hatte auch dieses Problem, und eine gute Möglichkeit, dies zu tun, wenn Sie sich innerhalb desselben Controllers befinden, ist die Verwendung benannter Parameter:

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

Dies kann Jahre her sein, hängt jedoch auch von Ihrer Global.asax-Kartenroute ab, da Sie Parameter hinzufügen oder bearbeiten können, die Ihren Wünschen entsprechen.

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

Wenn Sie zu einer Aktion außerhalb des Controllers umleiten müssen, funktioniert dies.

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

Das Folgende gelang mit asp.net Core 2.1. Es kann anderswo gelten. Das Wörterbuch ControllerBase.ControllerContext.RouteData.Values ​​ist direkt über die Aktionsmethode zugänglich und beschreibbar. 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
}
mikemay
quelle