RedirectToAction con parametro


597

Ho un'azione che chiamo da un'ancora così, Site/Controller/Action/IDdove IDè un int.

Successivamente devo reindirizzare a questa stessa azione da un controller.

C'è un modo intelligente per farlo? Attualmente sto IDnascondendo tempdata, ma quando premi F5 per aggiornare di nuovo la pagina dopo essere tornato indietro, i tempdata scompaiono e la pagina si arresta in modo anomalo.

Risposte:


947

È possibile passare l'id come parte del parametro routeValues ​​del metodo RedirectToAction ().

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

Ciò causerà un reindirizzamento a Sito / Controller / Azione / 99. Non sono necessari dati temporanei o qualsiasi tipo di visualizzazione.


2
Esiste un modo per farlo o qualcosa di simile ma anche specificare il controller? (Devo farlo da un controller a un'azione di un altro controller).
Diego,

18
@Diego: sì, ci sono un paio di sovraccarichi per questo. Nel mio esempio sarebbe RedirectToAction ("Azione", "Controller", nuovo {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,

C'è un modo per fare la stessa cosa ma non avere l'aggiornamento dell'URL in questo modo?
Degno 7

@KurtSchindler Comunque per aggiornare la tua risposta per includere il tuo esempio di commento di reindirizzamento anche a controller diversi? Per aiutare coloro che potrebbero saltare la lettura dei commenti.
Edward

195

La risposta di Kurt dovrebbe essere giusta, dalla mia ricerca, ma quando l'ho provato ho dovuto farlo per farlo funzionare davvero per me:

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

Se non avessi specificato il controller e l'azione in RouteValueDictionaryesso non avesse funzionato.

Anche quando codificato in questo modo, il primo parametro (Azione) sembra essere ignorato. Quindi, se specifichi semplicemente il controller in Dict e ti aspetti che il primo parametro specifichi l'Azione, non funzionerà neanche.

Se vieni più tardi, prova prima la risposta di Kurt e se hai ancora problemi prova questa.


6
Bella risposta. Inoltre, credo che il controllerparametro sia facoltativo se l'azione di reindirizzamento si trova nello stesso controller dell'azione da cui stai reindirizzando.
im1dermike,

1
dovrebbe essere, ma quando l'ho fatto in quel modo, non ha funzionato, ho dovuto aggiungere esplicitamente il controller ... che era letteralmente nei miei primi giorni di MVC, se dovessi indovinare ora direi che avuto qualche tipo di problema di installazione del routing da esaminare.
Eric Brown - Cal,

Strano. Funziona per me in MVC4.
im1dermike,

Questo è successo nei giorni MVC1, e ha funzionato bene per gli altri, ecco perché sospetto un problema di configurazione, guardando indietro.
Eric Brown - Cal,

@ EricBrown-Cal Dato anche il tuo contributo nei tuoi commenti, non pensi che la risposta di Kurt sia più adatta a coloro che cercano una risposta allo stesso problema che hai avuto nei tuoi giorni iniziali?
Edward

62

RedirectToAction con parametro:

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

1
Funziona? Credo che questa sia sintassi errata. Correggimi se sbaglio.
Mohammed Zameer,

1
@ pb2q new {id = id}funziona altrettanto bene perché il framework sa a quale variabile ti stai riferendo.
Edward

61

Vale anche la pena notare che è possibile passare attraverso più di 1 parametro. id verrà utilizzato per creare parte dell'URL e tutti gli altri verranno passati come parametri dopo un? nell'URL e sarà UrlEncoded come predefinito.

per esempio

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

Quindi l'URL sarebbe:

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

Questi possono quindi essere indicati dal controller:

public ActionResult ACTION(string id, string otherParam, string anotherParam) {
   // Your code
          }

43
//How to use RedirectToAction in MVC

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

esempio

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

39

Esempio MVC 4 ...

Si noti che non è sempre necessario passare il parametro denominato ID

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

E,

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

Ovviamente puoi assegnare una stringa ai campi del modello invece di usare ViewBag se questa è la tua preferenza.



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

Ha funzionato per me, non era necessario new{id = id}

Stavo reindirizzando all'interno dello stesso controller, quindi non mi serviva, "Controller"ma non sono sicuro della logica specifica dietro quando il controller è richiesto come parametro.


RedirectToAction("Action", "Controller", new { id = id});era proprio quello di cui avevo bisogno nella mia app Core 3.1.
orangecaterpillar

18

Se uno vuole mostrare un messaggio di errore per [httppost]allora può provare passando un ID usando

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

per dettagli come questo

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

Spero che funzioni bene.


16

....

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

....

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

15

Ho avuto anche questo problema, e un bel modo di farlo se ti trovi nello stesso controller è usare parametri nominati:

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

7

Questo potrebbe accadere anni fa, ma dipende anche dal percorso della tua mappa Global.asax poiché potresti aggiungere o modificare i parametri per adattarli a ciò che desideri.

per esempio.

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

quindi i parametri che dovrai passare cambieranno in:

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

7

Se hai bisogno di reindirizzare a un'azione esterna al controller funzionerà.

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

1

Quanto segue è riuscito con il core 2.1 di asp.net. Potrebbe applicarsi altrove. Il dizionario ControllerBase.ControllerContext.RouteData.Values ​​è direttamente accessibile e scrivibile dall'interno del metodo di azione. Forse questa è la destinazione finale dei dati nelle altre soluzioni. Mostra anche da dove provengono i dati di routing predefiniti.

[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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.