RedirectToAction z parametrem

596

Tak więc mam akcję, którą wzywam z kotwicy, Site/Controller/Action/IDgdzie IDjest int.

Później muszę przekierować do tej samej akcji z kontrolera.

Czy jest na to sprytny sposób? Obecnie IDchowam się w tempdata, ale kiedy wciśniesz f5, aby odświeżyć stronę po powrocie, tempdata zniknie, a strona się zawiesi.

Eric Brown - Cal
źródło

Odpowiedzi:

946

Możesz przekazać identyfikator jako część parametru routeValues ​​metody RedirectToAction ().

return RedirectToAction("Action", new { id = 99 });

Spowoduje to przekierowanie do strony / kontrolera / akcji / 99. Nie potrzebujesz danych tymczasowych ani żadnych danych widoku.

Kurt Schindler
źródło
2
Czy jest coś takiego, czy coś podobnego, ale także określenie kontrolera? (Muszę to zrobić od jednego kontrolera do działania innego kontrolera).
Diego
18
@Diego: tak, istnieje kilka przeciążeń. W moim przykładzie będzie to RedirectToAction („Action”, „Controller”, new {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
Czy istnieje sposób na zrobienie tego samego, ale bez takiej aktualizacji adresu URL?
Worthy7
@KurtSchindler W każdym razie, aby zaktualizować swoją odpowiedź, tak aby zawierała również przykład komentarza przekierowania do innego kontrolera? Aby pomóc tym, którzy mogą pominąć czytanie komentarzy.
Edward,
194

Odpowiedź Kurta powinna być trafna, z moich badań, ale kiedy spróbowałem, musiałem to zrobić, aby rzeczywiście działało dla mnie:

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

Jeśli nie określiłem kontrolera i akcji w RouteValueDictionarynim, to nie działało.

Także przy takim kodowaniu pierwszy parametr (Action) wydaje się być ignorowany. Jeśli więc po prostu określisz kontroler w Dict i oczekujesz, że pierwszy parametr określi akcję, to również nie zadziała.

Jeśli przyjdziesz później, najpierw wypróbuj odpowiedź Kurta, a jeśli nadal masz problemy, wypróbuj tę.

Eric Brown - Cal
źródło
6
Świetna odpowiedź. Ponadto uważam, że controllerparametr jest opcjonalny, jeśli akcja przekierowująca znajduje się na tym samym kontrolerze, co akcja przekierowująca.
im1dermike,
1
tak powinno być, ale kiedy to zrobiłem w ten sposób, to nie działało, musiałem wyraźnie dodać kontroler ... to było dosłownie w moich pierwszych dniach MVC, gdybym musiał zgadywać teraz, powiedziałbym miał problem z konfiguracją routingu.
Eric Brown - Cal
Dziwne. Działa dla mnie w MVC4.
im1dermike,
Stało się to za dni MVC1 i działało dobrze dla innych, dlatego podejrzewam problem z konfiguracją, patrząc wstecz.
Eric Brown - Cal
@ EricBrown-Cal Biorąc pod uwagę twoje własne uwagi w komentarzach, czy nie uważasz, że odpowiedź Kurta jest bardziej odpowiednia dla tych, którzy szukają odpowiedzi na ten sam problem, który miałeś na początku?
Edward,
62

RedirectToAction z parametrem:

return RedirectToAction("Action","controller", new {@id=id});
kavitha Reddy
źródło
1
Czy to działa? Uważam, że to niepoprawna składnia. Popraw mnie, jeśli się mylę.
Mohammed Zameer,
1
@ pb2q new {id = id}działa równie dobrze, ponieważ framework wie, do której zmiennej się odwołujesz.
Edward,
61

Warto również zauważyć, że można przejść przez więcej niż 1 parametr. id zostanie użyty do utworzenia części adresu URL, a wszelkie inne zostaną przekazane jako parametry po? w adresie URL i będzie domyślnie UrlEncoded.

na przykład

return RedirectToAction("ACTION", "CONTROLLER", new {
           id = 99, otherParam = "Something", anotherParam = "OtherStuff" 
       });

Tak więc adres URL to:

    /CONTROLLER/ACTION/99?otherParam=Something&anotherParam=OtherStuff

Mogą być następnie przywoływane przez kontroler:

public ActionResult ACTION(string id, string otherParam, string anotherParam) {
   // Your code
          }
CF5
źródło
43
//How to use RedirectToAction in MVC

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

przykład

return RedirectToAction("Index", "Home", new { id = 2});
Thivan Mydeen
źródło
39

Przykład MVC 4 ...

Pamiętaj, że nie zawsze musisz przekazać parametr o nazwie ID

var message = model.UserName + " - thanks for taking yourtime to register on our glorious site. ";
return RedirectToAction("ThankYou", "Account", new { whatever = message });

I,

public ActionResult ThankYou(string whatever) {
        ViewBag.message = whatever;
        return View();
} 

Oczywiście możesz przypisać ciąg do pól modelu zamiast używać ViewBag, jeśli taka jest twoja preferencja.

Rohit
źródło
21
RedirectToAction("Action", "Controller" ,new { id });

Pracował dla mnie, nie musiałem tego robić new{id = id}

Przekierowałem do tego samego kontrolera, więc nie potrzebowałem, "Controller"ale nie jestem pewien, co do logiki, kiedy kontroler jest wymagany jako parametr.

Zaeem Q
źródło
RedirectToAction("Action", "Controller", new { id = id});było dokładnie tym, czego potrzebowałem w mojej aplikacji Core 3.1.
orangecaterpillar
18

Jeśli ktoś chce wyświetlić komunikat o błędzie [httppost], może spróbować przekazać identyfikator za pomocą

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

dla takich szczegółów

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

Mam nadzieję, że działa dobrze.

Toriq Sagor
źródło
16

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

return RedirectToAction("ActionName", new { Id = parameter });
aslanpayi
źródło
15

Miałem również ten problem i całkiem dobrym sposobem na zrobienie tego, jeśli jesteś w tym samym kontrolerze, jest użycie nazwanych parametrów:

return RedirectToAction(actionName: "Action", routeValues: new { id = 99 });
Charles Philip
źródło
7

To może być lata temu, ale tak czy inaczej, zależy to również od trasy mapy Global.asax, ponieważ możesz dodawać lub edytować parametry, aby dopasować to, co chcesz.

na przykład.

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

parametry, które musisz przekazać, zmienią się na:

return RedirectToAction( "Main", new RouteValueDictionary( 
    new { controller = controllerName, action = "Main", Id = Id, extraParam = someVariable } ) );
Bahamut
źródło
7

Jeśli konieczne będzie przekierowanie do działania poza kontrolerem, zadziała.

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
chr.solr
źródło
1

Następujące działanie zakończyło się sukcesem asp.net core 2.1. Może mieć zastosowanie gdzie indziej. Słownik ControllerBase.ControllerContext.RouteData.Values ​​jest bezpośrednio dostępny i zapisywalny z poziomu metody akcji. Być może jest to ostateczny cel danych w innych rozwiązaniach. Pokazuje także, skąd pochodzą domyślne dane routingu.

[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
źródło