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


596

У мене є дія, яку я дзвоню з якоря таким чином, Site/Controller/Action/IDде IDє int.

Пізніше мені потрібно перенаправити на цю саму дію від контролера.

Чи є розумний спосіб це зробити? Наразі я зберігаю IDтемпдату, але коли ви натискаєте клавішу f5, щоб знову оновити сторінку, після повернення назад, темпдату немає і сторінка виходить з ладу.

Відповіді:


946

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

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

Це призведе до переадресації на сайт / контролер / дію / 99. Немає необхідності в темп або будь-яких видах даних перегляду.


2
Чи все-таки робити це чи щось подібне, але також вказати контролер? (Мені це потрібно зробити від одного контролера до дії іншого контролера).
Дієго

18
@Diego: так, є кілька перевантажень для цього. У моєму прикладі це буде RedirectToAction ("Дія", "Контролер", новий {id = 99}) msdn.microsoft.com/en-us/library/dd470154.aspx
Курт Шіндлер

10
VB -Return RedirectToAction("Action", "Controller", New With {.id = 99})
Джеремі А. Західний

Чи є спосіб зробити те ж саме, але не оновлювати URL-адресу, як це?
Варто 7

@KurtSchindler Все одно, щоб оновити свою відповідь, щоб включити ваш коментар, наприклад, переадресацію на інший контролер? Щоб допомогти тим, хто може пропустити читання коментарів.
Едвард

194

Відповідь Курта повинна бути правильною, з мого дослідження, але коли я спробував це, я повинен був зробити це, щоб змусити його насправді працювати:

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

Якщо я не вказав контролер, і дія в RouteValueDictionaryньому не вийшло.

Також при такому кодуванні перший параметр (Дія), здається, ігнорується. Отже, якщо ви просто вкажете контролер у Dict і очікуєте, що перший параметр вкаже дію, він також не працює.

Якщо ви збираєтеся пізніше, спробуйте спершу відповідь Курта, і якщо у вас все ще є проблеми, спробуйте цю.


6
Чудова відповідь. Також я вважаю, що controllerпараметр є необов’язковим, якщо дія переспрямування знаходиться в тому ж контролері, що і дія, з якої ви перенаправляєтесь.
im1dermike

1
це повинно бути, але коли я зробив це так, це не спрацювало, мені довелося явно додати контролер ... це було буквально в перші дні MVC, якщо я маю здогадуватися зараз, я б сказав, що я у мене виникло якесь питання налаштування маршрутизації.
Ерік Браун - Cal

Дивно. Для мене працює в 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
          }

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.
помаранчева гусениця

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

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 вдалося наступне: Це може застосовуватися в іншому місці. Словник 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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.