it-swarm.com.de

RedirectToAction mit Parameter

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.

532

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.

184

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.

874
Kurt Schindler

RedirectToAction mit Parameter:

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

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

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.

39
Rohit
//How to use RedirectToAction in MVC

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

beispiel

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

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 .

22
mateuscb

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.

17
Toriq Sagor

....

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

....

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

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 });
14
Charles Philip

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

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

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
6
chr.solr
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.

4
Zaeem Q

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
}
1
mikemay