带参数的RedirectToAction


596

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

稍后,我需要从Controller重定向到相同的Action。

有聪明的方法吗?当前,我存储在tempdata ID中,但是当您在返回后按f5键再次刷新页面时,tempdata消失了,页面崩溃了。

Answers:


945

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

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

这将导致重定向到Site / Controller / Action / 99。无需临时或任何类型的视图数据。


2
是否有这样做或类似的方法,但同时也指定了控制器?(我需要从一个控制器执行到另一个控制器的操作)。
迭戈

18
@Diego:是的,有一些重载。在我的示例中,它将是RedirectToAction(“ Action”,“ Controller”,new {id = 99})msdn.microsoft.com/zh-cn/library/dd470154.aspx
Kurt Schindler

10
VB-– Return RedirectToAction("Action", "Controller", New With {.id = 99})
杰里米·A

有没有办法做同样的事情但没有这样的url更新?
Worthy7 2016年

@KurtSchindler无论如何要更新您的答案,以包括您的重定向到其他控制器的注释示例?帮助那些可能会跳过阅读注释的人。
爱德华

194

从我的研究来看,库尔特的答案应该是正确的,但是当我尝试时,我必须这样做才能使它真正为我工作:

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

如果我未指定控制器,则该控制器中的操作RouteValueDictionary无效。

同样,当这样编码时,第一个参数(动作)似乎也被忽略了。因此,如果仅在Dict中指定控制器,并期望第一个参数指定Action,则它也不起作用。

如果您以后要来,请先尝试Kurt的答案,如果仍然有问题,请尝试此。


6
好答案。另外,我相信controller如果重定向操作与您要重定向的操作位于同一控制器中,则该参数是可选的。
im1dermike 2014年

1
应该是这样,但是当我那样做时,它没有用,我必须显式地添加控制器...这实际上是在MVC的第一天,如果我现在不得不猜测,我会说我有某种路由设置问题需要研究。
埃里克·布朗-2014年

奇怪的。在MVC4中为我工作。
im1dermike 2014年

发生在MVC1的日子里,对其他人来说效果很好,这就是为什么我回头怀疑配置问题。
埃里克·布朗-加州

@ EricBrown-Cal甚至在您的评论中也提交了您自己的内容,您认为Kurt的答案更适合那些寻求与您开始时遇到的相同问题的答案的人吗?
爱德华

62

RedirectToAction 带有参数:

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

1
它行得通吗?我相信这是不正确的语法。如我错了请纠正我。
xameeramir

1
@ pb2q也new {id = id}可以正常工作,因为框架知道您要指代哪个变量。
爱德华

61

还值得注意的是,您可以传递多个参数。id将用于构成URL的一部分,而其他任何ID将在?之后作为参数传递。在网址中,并将其默认设置为UrlEncoded。

例如

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
          }

43
//How to use RedirectToAction in MVC

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

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

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。



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

为我工作,不需要做 new{id = id}

我将重定向到同一控制器内,因此我不需要该控制器,"Controller"但是我不确定何时需要将控制器作为参数使用的特定逻辑。


RedirectToAction("Action", "Controller", new { id = id});正是我在Core 3.1应用程序中需要的。
orangecaterpillar

18

如果要显示错误消息,[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 });
            }
}

希望它能正常工作。


16

....

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

....

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

15

我也遇到了这个问题,如果您在同一个控制器中,那么使用它的一种很好的方法是使用命名参数:

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

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

7

如果您需要重定向到控制器外部的动作,则可以使用。

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

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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.