带参数的RedirectToAction

Eri*_*Cal 555 c# asp.net-mvc controller redirecttoaction

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

稍后我需要从Controller重定向到同一个Action.

有一个聪明的方法来做到这一点?目前我正在ID使用tempdata,但是当你回到f5后再次刷新页面时,tempdata就会消失,页面崩溃了.

Kur*_*ler 894

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

return RedirectToAction("Action", new { id = 99 });
Run Code Online (Sandbox Code Playgroud)

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

  • @Diego:是的,有几个重载.在我的例子中,它将是RedirectToAction("Action","Controller",new {id = 99})http://msdn.microsoft.com/en-us/library/dd470154.aspx (18认同)
  • VB - `返回RedirectToAction("Action","Controller",New With {.id = 99})` (9认同)
  • 值得注意的是,ID 参数的名称与该参数在 URL 中的显示方式有关,这取决于 RouteConfig 文件的情况以及路由机制的情况。例如,new { id = 100 } 可以生成 URL“/100”,而 new {groupId = 100} 可能会被解释为查询字符串(如上所述),从而生成 URL“?groupId=100”。 (4认同)
  • 有没有这样做或类似的事情,但也指定控制器?(我需要从一个控制器到另一个控制器的动作)。 (2认同)

Eri*_*Cal 185

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

return RedirectToAction( "Main", new RouteValueDictionary( 
    new { controller = controllerName, action = "Main", Id = Id } ) );
Run Code Online (Sandbox Code Playgroud)

如果我没有指定控制器并且其中的操作RouteValueDictionary不起作用.

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

如果你以后再来,先试试Kurt的答案,如果你还有问题,试试这个.

  • 很好的答案.另外,我相信`controller`参数是可选的,如果重定向动作与你重定向的动作在同一个控制器中. (6认同)

小智 56

RedirectToAction 带参数:

return RedirectToAction("Action","controller", new {@id=id});
Run Code Online (Sandbox Code Playgroud)

  • @pb2q `new {id = id}` 也同样有效,因为框架知道您引用的是哪个变量。 (2认同)

CF5*_*CF5 54

值得注意的是,您可以传递多个参数.id将用于组成URL的一部分,其他任何一个将作为参数后传递?在网址中,将默认为UrlEncoded.

例如

return RedirectToAction("ACTION", "CONTROLLER", new {
           id = 99, otherParam = "Something", anotherParam = "OtherStuff" 
       });
Run Code Online (Sandbox Code Playgroud)

所以网址是:

    /CONTROLLER/ACTION/99?otherParam=Something&anotherParam=OtherStuff
Run Code Online (Sandbox Code Playgroud)

然后,您的控制器可以引用它们:

public ActionResult ACTION(string id, string otherParam, string anotherParam) {
   // Your code
          }
Run Code Online (Sandbox Code Playgroud)


小智 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 });
Run Code Online (Sandbox Code Playgroud)

和,

public ActionResult ThankYou(string whatever) {
        ViewBag.message = whatever;
        return View();
} 
Run Code Online (Sandbox Code Playgroud)

当然,您可以将字符串分配给模型字段,而不是使用ViewBag(如果这是您的首选项).


Thi*_*een 39

//How to use RedirectToAction in MVC

return RedirectToAction("actionName", "ControllerName", routevalue);
Run Code Online (Sandbox Code Playgroud)

return RedirectToAction("Index", "Home", new { id = 2});
Run Code Online (Sandbox Code Playgroud)


mat*_*scb 22

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

return RedirectToAction("Action", new RouteValueDictionary(Model))
Run Code Online (Sandbox Code Playgroud)

如果你碰巧有收藏品,这会让它变得有点棘手,但另一个答案很好地涵盖了它.


小智 18

如果想要显示错误消息,[httppost]那么他/她可以尝试使用传递ID

return RedirectToAction("LogIn", "Security", new { @errorId = 1 });
Run Code Online (Sandbox Code Playgroud)

这样的细节

 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 });
            }
}
Run Code Online (Sandbox Code Playgroud)

希望它工作正常.


小智 16

....

int parameter = Convert.ToInt32(Session["Id"].ToString());
Run Code Online (Sandbox Code Playgroud)

....

return RedirectToAction("ActionName", new { Id = parameter });
Run Code Online (Sandbox Code Playgroud)


Cha*_*lip 15

我也有这个问题,如果你在同一个控制器内,这是一个很好的方法是使用命名参数:

return RedirectToAction(actionName: "Action", routeValues: new { id = 99 });
Run Code Online (Sandbox Code Playgroud)


小智 10

RedirectToAction("Action", "Controller" ,new { id });
Run Code Online (Sandbox Code Playgroud)

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

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

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

Bah*_*mut 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
        });
    }
Run Code Online (Sandbox Code Playgroud)

那么你需要传递的参数将改为:

return RedirectToAction( "Main", new RouteValueDictionary( 
    new { controller = controllerName, action = "Main", Id = Id, extraParam = someVariable } ) );
Run Code Online (Sandbox Code Playgroud)


chr*_*olr 6

如果您需要重定向到控制器外部的操作,这将起作用.

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
Run Code Online (Sandbox Code Playgroud)