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.

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.


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ę.


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

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
          }

43
//How to use RedirectToAction in MVC

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

przykład

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

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.



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.


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.


16

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

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

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

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

7

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

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

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", "mike@myemail.com");
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/mike@myemail.com
}
[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
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.