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

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

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

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

16 ответов

Решение

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

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

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

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

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

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

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

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

Также стоит отметить, что вы можете пройти более 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
          }

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

return RedirectToAction("Action","controller", new {@id=id});
//How to use RedirectToAction in MVC

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

пример

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

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

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

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

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

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

Работал на меня, не нужно было делать new{id = id}

Я перенаправил в тот же контроллер, поэтому мне не нужно "Controller" но я не уверен в конкретной логике, когда контроллер требуется в качестве параметра.

....

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

....

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

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

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

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

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

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

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

Это может быть несколько лет назад, но в любом случае это также зависит от маршрута вашей карты 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 } ) );

Эта одна строка кода сделает это:

      return Redirect("Action"+id);

Следующее успешно с ядром 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
}

Также вы можете отправить любой ViewBag, ViewData.. вот так

      return RedirectToAction("Action", new { Dynamic = ViewBag.Data= "any data" });
Другие вопросы по тегам