[Core 3.1] cshtml 파일에서 HttpContext 클래스 접근

728x90
반응형

cshtml 파일에서 세션에 대한 정보를 읽어오기 위해 HttpContext 클래스에 접근해야 하는 경우가 발생하였습니다. 

 

public IActionResult Index()
{
    var name = HttpContext.Session.GetString("_Name");
    TempData["Session"] = name;
    return View();
}

// ※ .Net Core 3.1 Sample code
public IActionResult Login()
{
    HttpContext.Session.SetString("_Name", "Jeff");
    return View();
}

View를 담당하는 cshtml 파일에서 해당 세션의 값을 가져오려면, Model 로 값을 넘기거나, TempData 변수에 담아서 넘기곤 했습니다. 

 

 

Controller 에서 HttpContext는 어떻게 접근 되는 것인가?

기본적으로 각각의 Controller 클래스는 추상 클래스인  Controller 를 상속 받습니다.

또한 ControllerBase 추상클래스는 HttpContext 클래스를 프로퍼티로 구현되어 있습니다. 

public class HomeController : Controller


public abstract class Controller : ControllerBase, IActionFilter, 
                                   IFilterMetadata, IAsyncActionFilter, IDisposable

이렇게 각각의 추상 클래스를 상속 받고 있기 때문에 

각 Controller에서 HttpContext 객체에 접근하여 Session 을 기록하고, 읽어올수 있는 것입니다. 

 


cshtml 파일에서 HttpContext 에 접근 할 수 있을까?

있습니다.  cshtml 파일에서 아래의 namespace를 추가해 줌으로써 접근이 가능합니다. 

 

@using Microsoft.AspNetCore.Http
@{
    ViewData["Title"] = "Home Page";
}

위 방법으로 namespace 에 접근이 가능합니다. 

하지만 Controller 에서 처럼 HttpContext 프로퍼티로 접근 하는 것이 아닌 Context 프로퍼티로 접근하게 됩니다.

<!-- Page Heading -->
<div>
    @Context.Session.GetString("_Name")
</div>

 

Context 객체를 따라가 보면, RazorPage 추상클래스에 프로퍼티로 HttpContext 가 구현되어 있습니다. 

이 Context 프로퍼티를 이용하여 HttpContext 클래스에 접근이 되는데요.

이 클래스는 Microsoft.AspNetCore.Http.HttpContext 클래스 이기 때문에 Session 에 접근이 가능한 것입니다.

 

 

728x90