POST 동사를 사용하여 어떻게 페이지로 리디렉션합니까?


131

RedirectToAction컨트롤러 내에서 호출 하면 HTTP GET을 사용하여 자동으로 리디렉션됩니다. HTTP POST를 사용하도록 명시 적으로 어떻게 말합니까?

GET 및 POST 요청을 모두 허용하는 조치가 있으며 POST를 RedirectToAction사용하여 값을 보낼 수 있기를 원합니다 .

이처럼 :

this.RedirectToAction(
    "actionname",
    new RouteValueDictionary(new { someValue = 2, anotherValue = "text" })
);

GET 대신 HTTP POST를 사용하여 someValueanotherValue값을 전송 하고 싶습니다 . 누구든지 이것을하는 방법을 알고 있습니까?


Jason의 답변 게시는 대부분의 시나리오에서 작동하며, 내가 볼 수있는 유일한 문제는 사고가 발생하기 쉽다는 것입니다. 즉, 액션 메서드를 호출하면 액션에 적용된 모든 필터를 직접 무시합니다 . 따라서 조치 메소드에 적용된 인증 또는 카운터 종류의 필터가있는 경우 해당 데이터가 손실 될 수 있습니다. 액션 메서드를 직접 호출하면 작동하지만주의해서 적용해야합니다.
amarnath chatterjee

답변:


103

HTTP는 POST를 사용하는 페이지로의 리디렉션을 지원하지 않습니다. 어딘가로 리디렉션하면 HTTP "Location"헤더가 브라우저에게 어디로 가야하는지 알려주고 브라우저는 해당 페이지에 대한 GET 요청을합니다. POST 요청뿐만 아니라 GET 요청을 수락하려면 페이지의 코드를 작성해야합니다.


4
내 대답이 왜 받아 들여지지 않는지 궁금해, 나는 수사학이 건전하다고 생각합니다. :) 그리고 다시, 나는 그것에 대해 약간 편견이있을 수 있습니다 ...
Jason Bunting

14
이 답변은 기본적으로 정확하지만 완전하지는 않습니다. 훨씬 나은 해결 방법은 아래 Jason Bunting 답변을 참조하십시오.
Adrian Grigore

160

특정 예를 들어, 실제로 브라우저가 리디렉션을 가져 오는 것에 신경 쓰지 않기 때문에 (이미 수락 한 답변을 수락함으로써) 분명히 할 것입니다.

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index() {
   // obviously these values might come from somewhere non-trivial
   return Index(2, "text");
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(int someValue, string anotherValue) {
   // would probably do something non-trivial here with the param values
   return View();
}

그것은 쉽게 작동하고 실제로는 재미있는 사업이 없습니다-이것은 당신이 두 번째 요청이 실제로 HTTP POST 요청 만 수락한다는 사실을 유지할 수있게 해줍니다 (이 경우를 제외하고는 통제 할 수 있습니다). 답변에 게시 한 링크가 제안하는 TempData 중 하나를 사용하십시오.

나는 무언가가 있다면 이것에 "잘못된"것이 무엇인지 알고 싶습니다. 분명히 브라우저로 리디렉션을 보내려면 작동하지 않지만 나에게 이상한 것처럼 보이기 때문에 왜 변환하려고하는지 물어봐야합니다.

희망이 도움이됩니다.


7
왜 당신이 다운 보트를 받았는지 누가 알 겠어요? 이것은 매우 유용한 방법입니다.
Peter J

2
이것이 항상이 문제를 해결하는 방법입니다. 이것을 다운 보팅하는 것은 의미가 없습니다.
Adrian Grigore

39
나는 당신이 그들을 모르는 사람들을 바보라고 부르는 것에 동의하지 않지만 투표했습니다.
Jim Schubert

3
나는 downvoter가 아니지만 이것에 대한 한 가지주의는 다른 이름으로 뷰를 호출하거나 매개 변수가 중요한 경우 손실됩니다. 그 이유는 URL이 서버 측 리디렉션 전에 action + parameters를 반영하기 때문입니다. 새로 고침이 이전 URL을 사용했기 때문에 사용자가 페이지를 새로 고친 다음 이전 페이지에서 자신을 발견 한 경우 사용자가 혼동을 일으킬 수 있습니다. 이 기술은 본질적으로 asp.net의 Server.Transfer와 매우 유사하므로 동일한주의를 기울여야합니다.
AaronLS

15
나는 그 자체로 downvote하지 않았지만 이유를 볼 수 있습니다. 이 방법은 MVC 패턴으로 설정된 코딩 규칙을 위반합니다. 그것은 단지 같은 조치를 호출 할 때 작동합니다. 동일한 컨트롤러에서 작업이 다른 작업 인 경우 라우팅 값이 고정되고 잘못된보기가 반환됩니다. 한마디로 : 이러지 마십시오.
erlando

21

쿼리 문자열에 데이터를 포함하지 않고 리디렉션하는 동안 두 작업간에 데이터를 전달하려면 모델을 TempData 객체에 넣습니다.

동작

TempData["datacontainer"] = modelData;

전망

var modelData= TempData["datacontainer"] as ModelDataType; 

TempData는 수명이 매우 짧은 인스턴스이므로 현재 및 후속 요청 중에 만 사용해야합니다! TempData는 이러한 방식으로 작동하므로 다음 요청이 무엇인지 확실히 알아야하며 다른 뷰로 리디렉션하는 것이이를 보장 할 수있는 유일한 시간입니다.

따라서 TempData를 사용하여 안정적으로 작동하는 유일한 시나리오는 리디렉션하는 경우입니다.


11

이거 한번 해봐

return Content("<form action='actionname' id='frmTest' method='post'><input type='hidden' name='someValue' value='" + someValue + "' /><input type='hidden' name='anotherValue' value='" + anotherValue + "' /></form><script>document.getElementById('frmTest').submit();</script>");

2
그것을 싫어하지만 그것을 사랑 :)
divinci

그런 해킹이지만 DRY를 위반하거나 전체 설정을 재배 선하지 않고 내가 원하는 것을 할 수있는 유일한 방법이었습니다! 감사!
jamheadart

6

Jason Bunting의 답변을 확장하고 싶습니다

이처럼

ActionResult action = new SampelController().Index(2, "text");
return action;

그리고 Eli는 일반적인 변수로 만드는 방법에 대한 아이디어를 얻을 것입니다.

모든 유형의 컨트롤러를 얻을 수 있습니다


당신이 가진 컨트롤러 인스턴스를 생성하지 말아야 new ...()당신이 잃을 것이기 때문에 RequestContext- 당신은 동일한 컨트롤러에 이미있는 경우, 새 인스턴스를 만들 필요가 있습니다. 그렇지 않으면 다음 방법을 사용하십시오. SampelController sampleController = DependencyResolver.Current.GetService<SampelController>()그렇다면 : 힌트 만 sampleController.ControllerContext = new ControllerContext(Request.RequestContext, sampleController);할 수 있습니다 return sampleController.Index(2, "text");:)
Matthias Burger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.