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

597

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

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

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

Эрик Браун - Кэл
источник

Ответы:

947

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

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

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

Курт Шиндлер
источник
2
Есть ли способ сделать это или что-то подобное, но также указать контроллер? (Мне нужно сделать это с одного контроллера на действие другого контроллера).
Диего
18
@ Диего: да, для этого есть пара перегрузок. В моем примере это будет RedirectToAction («Действие», «Контроллер», новый {id = 99}) msdn.microsoft.com/en-us/library/dd470154.aspx
Курт Шиндлер
10
VB -Return RedirectToAction("Action", "Controller", New With {.id = 99})
Джереми А. Уэст
Есть ли способ сделать то же самое, но не обновить URL, как это?
Достойно7
@KurtSchindler В любом случае, чтобы обновить свой ответ, включив в свой пример пример перенаправления на другой контроллер? Чтобы помочь тем, кто может пропустить чтение комментариев.
Эдвард
195

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

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

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

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

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

Эрик Браун - Кэл
источник
6
Отличный ответ. Кроме того, я считаю, что controllerпараметр является необязательным, если действие перенаправления находится в том же контроллере, что и действие, из которого вы перенаправляете.
im1dermike
1
это должно быть, но когда я сделал это таким образом, это не сработало, я должен был явно добавить контроллер ... это было буквально в мои первые дни MVC, если бы мне пришлось угадывать сейчас, я бы сказал, что я возникла какая-то проблема с настройкой маршрутизации.
Эрик Браун - Cal
Weird. У меня работает в MVC4.
im1dermike
Это произошло еще в MVC1-е дни, и для других это работало нормально, поэтому я подозреваю, что проблема с конфигурацией, оглядываясь назад.
Эрик Браун - Cal
@ EricBrown-Cal. Даже с учетом вашего собственного комментария в комментариях, вы не считаете, что ответ Курта лучше подходит тем, кто ищет ответ на ту же проблему, что и у вас в первые дни?
Эдвард
62

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

return RedirectToAction("Action","controller", new {@id=id});
Кавита Редди
источник
1
Это работает? Я считаю, что это неправильный синтаксис. Поправьте меня если я ошибаюсь.
Мохаммед Замир,
1
@ pb2q new {id = id}работает так же хорошо, потому что фреймворк знает, на какую переменную вы ссылаетесь.
Эдвард
61

Также стоит отметить, что вы можете пройти более 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
          }
CF5
источник
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"но я не уверен в конкретной логике, когда контроллер требуется в качестве параметра.

Заим Q
источник
RedirectToAction("Action", "Controller", new { id = id});было именно то, что мне было нужно в моем приложении Core 3.1.
Апельсиновая гусеница
18

Если кто-то хочет показать сообщение об ошибке, [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 });
            }
}

Надеюсь, это работает нормально.

Торик Сагор
источник
16

....

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

....

return RedirectToAction("ActionName", new { Id = parameter });
aslanpayi
источник
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 } ) );
Bahamut
источник
7

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

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
chr.solr
источник
1

Следующее успешно с ядром asp.net 2.1. Это может применяться в другом месте. Словарь ControllerBase.ControllerContext.RouteData.Values ​​напрямую доступен и доступен для записи из метода действия. Возможно, это конечный пункт назначения данных в других решениях. Он также показывает, откуда берутся данные маршрутизации по умолчанию.

[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
}
mikemay
источник