带参数的RedirectToAction

我有一个动作,我从一个锚点调用,因此, Site/Controller/Action/ID其中ID是一个int

稍后我需要redirect到来自Controller的同一个Action。

有没有一个聪明的方法来做到这一点? 目前我存储在tempdata中的ID ,但是当你回去后再次点击f5刷新页面,tempdata就消失了,页面崩溃了。

您可以传递该id作为RedirectToAction()方法的routeValues参数的一部分。

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

这将导致redirect到Site / Controller / Action / 99。 不需要临时或任何types的视图数据。

Kurt的答案应该是正确的,从我的研究中,但是当我尝试时,我必须这样做才能真正为我工作:

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

如果我没有在RouteValueDictionary指定控制器和操作,它不起作用。

同样当这样编码时,第一个参数(Action)似乎被忽略。 所以如果你只是在Dict中指定了控制器,并且期望第一个参数指定Action,那么它也不起作用。

如果你以后再来,先试试库尔特的答案,如果你还有问题,就试试这个。

带参数的RedirectToAction

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

MVC 4的例子…

请注意,您并不总是必须传递名为ID的参数

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

和,

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

当然,你可以将string分配给模型字段,而不是使用ViewBag,如​​果这是你的偏好。

 //How to use RedirectToAction in MVC return RedirectToAction("actionName", "ControllerName", routevalue); 

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

还值得注意的是,你可以通过多个参数。 id将被用来组成URL的一部分,任何其他的会被作为parameter passing出去之后, 在URL中,将默认为UrlEncoded。

例如

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

所以这个url是:

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

这些可以被你的控制器引用:

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

如果你的参数碰巧是一个复杂的对象, 这解决了这个问题 。 关键是RouteValueDictionary构造函数。

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

如果你碰巧有collections品,这使得它有点棘手, 但这个其他答案涵盖了这个很好 。

….

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

….

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

我也遇到了这个问题,如果你在同一个控制器中,这样做的一个很好的方法就是使用命名参数:

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

如果想显示[httppost]错误信息,那么他/她可以尝试通过传递一个ID使用

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

为这样的细节

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

希望它能正常工作。

这可能是几年前,但无论如何,这也取决于你的Global.asax地图路线,因为你可以添加或编辑参数,以适应你想要的。

例如。

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

那么你需要通过的参数将变成:

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

如果你需要redirect到控制器之外的行动,这将工作。

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