매개 변수가있는 RedirectToAction


596

내가 thusly 히 앵커에서 호출 작업이 입니다 .Site/Controller/Action/IDIDint

나중에 컨트롤러에서 동일한 작업으로 리디렉션해야합니다.

이것을 할 수있는 영리한 방법이 있습니까? 현재 tempdata ID를 숨기고 있지만 f5를 눌러 다시 돌아간 후 페이지를 새로 고치면 tempdata가 사라지고 페이지가 충돌합니다.

답변:


946

RedirectToAction () 메소드의 routeValues ​​매개 변수의 일부로 id를 전달할 수 있습니다.

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

이로 인해 Site / Controller / Action / 99로 리디렉션됩니다. 임시 또는 모든 종류의 뷰 데이터가 필요하지 않습니다.


2
어쨌든 그와 비슷한 일을하지만 컨트롤러를 지정하는 것이 있습니까? (한 컨트롤러에서 다른 컨트롤러의 작업으로 수행해야합니다).
Diego

18
@ Diego : 예, 몇 가지 과부하가 있습니다. 내 예에서는 RedirectToAction ( "Action", "Controller", new {id = 99}) msdn.microsoft.com/en-us/library/dd470154.aspx
Kurt Schindler가

10
VB -Return RedirectToAction("Action", "Controller", New With {.id = 99})
제레미 A. 웨스트

동일한 작업을 수행하지만 URL 업데이트를 수행하지 않는 방법이 있습니까?
Worthy7

@KurtSchindler 어쨌든 다른 컨트롤러로의 리디렉션에 대한 귀하의 의견 예제를 포함하도록 답변을 업데이트 하시겠습니까? 댓글 읽기를 건너 뛰는 사람들을 돕기 위해.
Edward

194

커트의 대답 은 내 연구에서 옳 아야 하지만 시도했을 때 실제로 나를 위해 일하기 위해서는이 작업을 수행해야했습니다.

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

컨트롤러를 지정하지 않으면 컨트롤러의 동작이 RouteValueDictionary작동하지 않습니다.

또한 이와 같이 코딩하면 첫 번째 매개 변수 (Action)가 무시되는 것 같습니다. 따라서 Dict에서 컨트롤러를 지정하고 첫 번째 매개 변수가 동작을 지정해야한다면 작동하지 않습니다.

나중에 오는 경우 먼저 Kurt의 답변을 시도하고 여전히 문제가있는 경우이 답변을 시도하십시오.


6
좋은 대답입니다. 또한 controller리디렉션 작업이 리디렉션하려는 작업과 동일한 컨트롤러에 있으면 매개 변수가 선택 사항 이라고 생각합니다 .
im1dermike

1
그것은 예상되었지만 작동하지 않으면 작동하지 않았고 컨트롤러를 명시 적으로 추가해야했습니다 ... MVC의 첫날에 말 그대로 추측했습니다. 살펴볼 일종의 라우팅 설정 문제가있었습니다.
Eric Brown-Cal

기묘한. MVC4에서 나를 위해 일합니다.
im1dermike

이것은 MVC1 일에 다시 발생했으며 다른 사람들에게는 잘 작동했기 때문에 구성 문제가 의심되는 이유입니다.
Eric Brown-Cal

@ EricBrown-Cal 귀하의 의견에 대한 귀하의 의견조차도 Kurt의 답변이 귀하가 처음에 겪었던 것과 동일한 문제에 대한 답변을 찾는 사람들에게 더 적합하다고 생각하지 않습니까?
Edward

62

RedirectToAction 매개 변수로 :

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

1
작동합니까? 나는 이것이 잘못된 구문이라고 생각합니다. 틀 렸으면 말해줘.
Mohammed Zameer

1
@ pb2q new {id = id}는 프레임 워크가 참조하는 변수를 알고 있기 때문에 잘 작동합니다.
Edward

61

또한 둘 이상의 매개 변수를 통과 할 수 있다는 점도 주목할 가치가 있습니다. 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 앱에 필요한 것입니다.
orangecaterpillar

18

에 대한 오류 메시지를 표시하려면 [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

....

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 코어 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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.