RedirectToAction с параметром - PullRequest
520 голосов
/ 11 августа 2009

У меня есть действие, которое я вызываю с привязки таким образом, Site/Controller/Action/ID, где ID - это int.

Позже мне нужно перенаправить на это же действие с контроллера.

Есть ли умный способ сделать это? В настоящее время я храню ID в tempdata, но когда вы нажмите f5, чтобы обновить страницу после возвращения, временные данные исчезли, и страница вылетает.

Ответы [ 14 ]

857 голосов
/ 11 августа 2009

Вы можете передать идентификатор как часть параметра routeValues ​​метода RedirectToAction ().

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

Это приведет к перенаправлению на сайт / контроллер / действие / 99. Нет необходимости во временных или каких-либо данных просмотра.

178 голосов
/ 19 августа 2009

Ответ Курта должен быть правильным, исходя из моих исследований, но когда я попробовал это, мне пришлось сделать это, чтобы заставить его действительно работать на меня:

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

Если я не указал контроллер и действие в RouteValueDictionary, оно не сработало.

Также при таком кодировании первый параметр (действие), похоже, игнорируется. Так что если вы просто указываете контроллер в Dict и ожидаете, что первый параметр будет указывать Action, он тоже не будет работать.

Если вы приедете позже, сначала попробуйте ответить Курту, а если у вас все еще есть проблемы, попробуйте этот.

53 голосов
/ 25 февраля 2015

RedirectToAction с параметром:

return RedirectToAction("Action","controller", new {@id=id});
50 голосов
/ 14 августа 2015

Стоит также отметить, что вы можете пройти через более 1 параметра. id будет использоваться для составления части URL, а любые другие будут передаваться в качестве параметров после символа? в 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
          }
39 голосов
/ 12 июля 2013

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, если это ваше предпочтение.

38 голосов
/ 03 декабря 2015
//How to use RedirectToAction in MVC

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

пример

return RedirectToAction("Index", "Home", new { id = 2});
22 голосов
/ 05 марта 2014

Если ваш параметр оказывается сложным объектом, это решает проблему . Ключ - конструктор RouteValueDictionary.

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

Если у вас есть коллекции, это немного усложняет, , но этот другой ответ очень хорошо описывает это .

17 голосов
/ 06 марта 2017

Если кто-то хочет показать сообщение об ошибке для [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 голосов
/ 12 марта 2013

....

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

....

return RedirectToAction("ActionName", new { Id = parameter });
14 голосов
/ 06 июня 2013

У меня тоже была эта проблема, и довольно хороший способ сделать это, если вы находитесь в одном контроллере, это использовать именованные параметры:

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