Question RedirectToAction avec paramètre


J'ai une action que j'appelle d'une ancre ainsi, Site/Controller/Action/ID où ID est un int.

Plus tard, je dois rediriger vers cette même action depuis un contrôleur.

Y a-t-il une manière intelligente de faire ceci? Actuellement je me cache ID dans tempdata, mais quand vous appuyez sur f5 pour actualiser la page après le retour, la tempdata a disparu et la page se bloque.


458
2017-08-10 22:05


origine


Réponses:


Vous pouvez passer l'ID dans le paramètre routeValues ​​de la méthode RedirectToAction ().

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

Cela provoquera une redirection vers Site / Controller / Action / 99. Pas besoin de temp ou de tout type de données de vue.


757
2017-08-10 22:38



La réponse de Kurt devrait avoir raison, d'après mes recherches, mais quand je l'ai essayé, j'ai dû le faire pour que ça fonctionne vraiment pour moi:

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

Si je n'ai pas spécifié le contrôleur et l'action dans le RouteValueDictionary ça n'a pas marché.

De plus, quand il est codé comme cela, le premier paramètre (Action) semble être ignoré. Donc, si vous spécifiez simplement le contrôleur dans le Dict, et attendez que le premier paramètre spécifie l'action, cela ne fonctionne pas non plus.

Si vous arrivez plus tard, essayez d'abord la réponse de Kurt, et si vous avez encore des problèmes, essayez celui-ci.


157
2017-08-19 15:44



RedirectToAction avec paramètre:

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

47
2018-02-25 05:14



MVC 4 exemple ...

Notez que vous ne devez pas toujours transmettre le paramètre nommé ID

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

Et,

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

Bien entendu, vous pouvez attribuer une chaîne à des champs de modèle au lieu d'utiliser ViewBag si cela vous convient.


37
2017-07-12 16:55



//How to use RedirectToAction in MVC

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

    Exemple

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

36
2017-12-03 13:46



Il est également intéressant de noter que vous pouvez passer plus de 1 paramètre. id sera utilisé pour faire partie de l'URL et tous les autres seront transmis en tant que paramètres après un? dans l'URL et sera UrlEncoded par défaut.

par exemple.

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

Donc, l'URL serait:

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

Ceux-ci peuvent ensuite être référencés par votre contrôleur:

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

31
2017-08-14 13:24



Si votre paramètre se trouve être un objet complexe, cela résout le problème. La clé est la RouteValueDictionary constructeur.

return RedirectToAction("Action", new RouteValueDictionary(Model))

Si vous avez des collections, cela rend les choses un peu plus compliquées, mais cette autre réponse couvre très bien cela.


19
2018-03-05 18:24



....

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

....

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

15
2018-03-12 15:30



J'ai aussi eu ce problème, et une bonne façon de le faire si vous êtes dans le même contrôleur est d'utiliser des paramètres nommés:

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

14
2018-06-06 14:30



Si l'on veut afficher un message d'erreur pour [httppost] alors il / elle peut essayer en passant une identification en utilisant

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

pour des détails comme celui-ci

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

J'espère que ça fonctionne bien.


14
2018-03-06 06:30



Cela pourrait être il y a des années mais de toute façon, cela dépend aussi de votre route carte Global.asax puisque vous pouvez ajouter ou modifier les paramètres pour s'adapter à ce que vous voulez.

par exemple.

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

alors les paramètres que vous devrez passer passeront à:

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

7
2017-08-31 12:45