POST 로 데이터를 전송하였을 경우 Redirect 를 하지 않고 F5 등으로 새로고침을 하면 다시 POST 가 전송됩니다.
이는 POST 구현에 따라 Update 가 있을 수도 있어 원하지는 결과를 초래할 수도 있죠. 그래서 많이 사용하는 것이 PRG 패턴 입니다.
영어 약자로 쓰는 뭔가 대단한듯하지만...Post 로 호출하면 Get 요청으로 Redirect 하는 단순한 패턴 입니다. 예를 들어 값을 입력한 후 Post 로 처리한 후 결과 페이지를 Get 방식으로 호출하는 방식이죠.
예를 들어.. 컨트롤러는 아래와 같이 구현이 되어 있다고 합시다. Post 로 데이터가 넘어오면 그 값을 그냥 출력하는 간단한 컨트롤러 입니다.
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ContentResult Index(string name)
{
return Content("Name : " + name);
}
}
이경우 /Home/Index 에서 submit 을 하면 아래와 같이 결과가 나오거 거기서 F5 를 누르면 아래와 팝업과 같이 다시 Post 를 하게 됩니다. 예제를 하기 위해서 단순 출력이라 의미가 없지만 만약 Post 로 받은 컨트롤러에서 업데이트를 하는 로직이 있다면 중복해서 처리가 되겠죠!!
그래서 Post 로 받는 컨트롤러를 이렇게 Get 으로 Redirect 시켜주면 결과 페이지에서 새로고침을 해도 Post 가 다시 호출 되지는 않습니다.
[HttpPost]
public RedirectToRouteResult Index(string name)
{
return RedirectToAction("PrintResult", new { name = name });
}
[HttpGet]
public ContentResult PrintResult(string name)
{
return Content("Name : " + name);
}
데이터 넘기는 것은 그냥.. 이런거다라고 설명하기 위한 샘플이니 개념만 이해하시면 됩니다!!
혹은 TempData 를 이용하는 것도 좋은 방법입니다.
Redirect 하기 전에 TempData["Name"] = name; 이렇게 선언을 하고 PrintResult 에서 TempData["Name"] 을 가져다 쓰면 됩니다. TempData 는 그 값을 읽을 경우 처리가 완료되어 삭제 됩니다. 이런 경우에 적절한 방법이라고 생각합니다.
단!! TempData 를 삭제하지 않고 유지하기 위해서는 Peek or Keep 메서드를 사용하면 됩니다. 그렇다고 계속 유지되는 것은 아니고 다음에 다시 읽으면 삭제 됩니다.
TempData.Keep("Name");
'IT > C#' 카테고리의 다른 글
C# EventLog 에 기록하는 방법 (0) | 2023.12.22 |
---|---|
C# .NET AES 256 암복호화 (0) | 2023.12.22 |
MVC5 Html Helper (Core 아님) (0) | 2023.03.30 |
ActionResult 종류 (0) | 2023.03.30 |
Namespce 로 Controller 분리 - Route (0) | 2023.03.30 |