我有一个我从锚点调用的动作,Site/Controller/Action/ID
其中ID
是int
。
稍后我需要从Controller重定向到同一个Action。
有一种聪明的方法吗?目前我正在ID
藏匿tempdata,但是当你
返回后点击f5再次刷新页面,tempdata消失,页面崩溃。
答案 0 :(得分:849)
您可以将id作为RedirectToAction()方法的routeValues参数的一部分传递。
return RedirectToAction("Action", new { id = 99 });
这将导致重定向到Site / Controller / Action / 99。不需要临时或任何类型的视图数据。
答案 1 :(得分:175)
Kurt's answer应该是正确的,但是当我尝试它时,我必须这样做才能让它真正为我工作:
return RedirectToAction( "Main", new RouteValueDictionary(
new { controller = controllerName, action = "Main", Id = Id } ) );
如果我没有在RouteValueDictionary
中指定控制器和操作,则它不起作用。
当像这样编码时,第一个参数(Action)似乎被忽略了。因此,如果您只是在Dict中指定控制器,并期望第一个参数指定Action,它也不起作用。
如果您稍后再来,请先尝试Kurt的回答,如果您仍然遇到问题,请尝试这个。
答案 2 :(得分:52)
RedirectToAction
参数:
return RedirectToAction("Action","controller", new {@id=id});
答案 3 :(得分:47)
值得注意的是,您可以传递多个参数。 id将用于构成URL的一部分,其他任何一个将作为参数传递给一个?在网址中,将默认为UrlEncoded。
e.g。
return RedirectToAction("ACTION", "CONTROLLER", new {
id = 99, otherParam = "Something", anotherParam = "OtherStuff"
});
所以网址是:
/CONTROLLER/ACTION/99?otherParam=Something&anotherParam=OtherStuff
然后您的控制器可以引用它们:
public ActionResult ACTION(string id, string otherParam, string anotherParam) {
// Your code
}
答案 4 :(得分:39)
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();
}
当然,如果您愿意,可以将字符串分配给模型字段,而不是使用ViewBag。
答案 5 :(得分:37)
//How to use RedirectToAction in MVC
return RedirectToAction("actionName", "ControllerName", routevalue);
return RedirectToAction("Index", "Home", new { id = 2});
答案 6 :(得分:22)
如果您的参数碰巧是一个复杂的对象,this solves the problem。关键是RouteValueDictionary
构造函数。
return RedirectToAction("Action", new RouteValueDictionary(Model))
如果你碰巧有收藏品,那会让它变得有点棘手,but this other answer covers this very nicely。
答案 7 :(得分:17)
如果有人想显示[httppost]
的错误消息,那么他/她可以尝试使用
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 });
}
}
希望它能正常工作。
答案 8 :(得分:16)
...
int parameter = Convert.ToInt32(Session["Id"].ToString());
...
return RedirectToAction("ActionName", new { Id = parameter });
答案 9 :(得分:14)
我也遇到过这个问题,如果你在同一个控制器内,这是一个很好的方法就是使用命名参数:
return RedirectToAction(actionName: "Action", routeValues: new { id = 99 });
答案 10 :(得分:7)
这可能是几年前,但无论如何,这也取决于您的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 } ) );
答案 11 :(得分:6)
如果您需要重定向到控制器外部的操作,这将有效。
return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
答案 12 :(得分:2)
RedirectToAction("Action", "Controller" ,new { id });
为我工作,不需要做new{id = id}
我将重定向到同一控制器内,因此不需要"Controller"
,但是我不确定何时需要将控制器作为参数。
答案 13 :(得分:2)
这一行代码就可以做到:
return Redirect("Action"+id);
答案 14 :(得分:1)
以下内容以asp.net core 2.1成功。它可能适用于其他地方。字典ControllerBase.ControllerContext.RouteData.Values可以从action方法中直接访问和写入。也许这是其他解决方案中数据的最终目的地。它还显示默认路由数据来自何处。
[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
}