[asp.net-mvc] ASP.NET MVC의 세션 변수

사용자가 특정 요청을하는 웹 사이트 내에서 여러 웹 페이지를 탐색 할 수있는 웹 응용 프로그램을 작성 중입니다. 사용자가 입력 한 모든 정보는 내가 만든 개체에 저장됩니다. 문제는 웹 사이트의 어느 부분에서 나이 객체에 액세스해야하며 이것을 달성하는 가장 좋은 방법을 모른다는 것입니다. 한 가지 해결책은 세션 변수를 사용하는 것이지만 ASP .net MVC에서 사용하는 방법을 모르겠습니다. 세션 변수는 어디에서 선언합니까? 다른 방법이 있습니까?



답변

사물이 실제로 세션 상태에 속하는지 생각하고 싶을 것입니다. 이것은 내가 지금하고있는 일이며, 모든 것에 대한 강력한 유형의 접근 방식이지만 세션 컨텍스트에 넣을 때주의해야합니다. 일부 사용자의 것이기 때문에 모든 것이 있어야하는 것은 아닙니다.

global.asax에서 OnSessionStart 이벤트 연결

void OnSessionStart(...)
{
    HttpContext.Current.Session.Add("__MySessionObject", new MySessionObject());
}

HttpContext.Current 속성! = null 인 코드의 어느 곳에서나 해당 객체를 검색 할 수 있습니다. 확장 방법 으로이 작업을 수행합니다.

public static MySessionObject GetMySessionObject(this HttpContext current)
{
    return current != null ? (MySessionObject)current.Session["__MySessionObject"] : null;
}

이렇게하면 코드에서 할 수 있습니다

void OnLoad(...)
{
    var sessionObj = HttpContext.Current.GetMySessionObject();
    // do something with 'sessionObj'
}


답변

대답은 정확하지만 ASP.NET MVC 3 앱에서 구현하는 데 어려움을 겪었습니다. 컨트롤러에서 Session 객체에 액세스하고 싶었는데 왜 “인스턴스가 객체 오류의 인스턴스로 설정되지 않았습니다”라는 메시지가 계속 나타나는지 알 수 없었습니다. 내가 알았던 것은 컨트롤러에서 다음을 수행하여 세션에 액세스하려고 할 때 해당 오류가 계속 발생한다는 것입니다. 이것은 this.HttpContext가 Controller 객체의 일부이기 때문입니다.

this.Session["blah"]
// or
this.HttpContext.Session["blah"]

그러나 내가 원했던 것은 위의 답변이 Global.asax.cs에서 사용하도록 제안하기 때문에 System.Web 네임 스페이스의 일부인 HttpContext였습니다. 따라서 다음을 명시 적으로 수행해야했습니다.

System.Web.HttpContext.Current.Session["blah"]

이것은 내가 MO 주변에 있지 않은 것을했는지 확실하지 않지만 누군가에게 도움이되기를 바랍니다.


답변

장소에 대해 “HTTPContext.Current.Session”을 보는 것을 싫어하기 때문에 단일 톤 패턴을 사용하여 세션 변수에 액세스하므로 강력한 유형의 데이터 백에 쉽게 액세스 할 수 있습니다.

[Serializable]
public sealed class SessionSingleton
{
    #region Singleton

    private const string SESSION_SINGLETON_NAME = "Singleton_502E69E5-668B-E011-951F-00155DF26207";

    private SessionSingleton()
    {

    }

    public static SessionSingleton Current
    {
        get
        {
            if ( HttpContext.Current.Session[SESSION_SINGLETON_NAME] == null )
            {
                HttpContext.Current.Session[SESSION_SINGLETON_NAME] = new SessionSingleton();
            }

            return HttpContext.Current.Session[SESSION_SINGLETON_NAME] as SessionSingleton;
        }
    }

    #endregion

    public string SessionVariable { get; set; }
    public string SessionVariable2 { get; set; }

    // ...

어디서나 데이터에 액세스 할 수 있습니다.

SessionSingleton.Current.SessionVariable = "Hello, World!";


답변

asp.net mvc를 사용하는 경우 세션에 액세스하는 간단한 방법이 있습니다.

컨트롤러에서 :

{Controller}.ControllerContext.HttpContext.Session["{name}"]

보기에서 :

<%=Session["{name}"] %>

이것이 세션 변수에 액세스하는 가장 좋은 방법은 아니지만 직접 경로입니다. 따라서 빠른 프로토 타입 제작시주의해서 사용하고, 적절 해지면 래퍼 / 컨테이너 및 OnSessionStart를 사용하십시오.

HTH


답변

이모 ..

  1. 뷰 / 마스터 페이지에서 세션을 참조하지 마십시오
  2. 세션 사용을 최소화하십시오. MVC는이를 위해 TempData obj를 제공하는데, 이는 기본적으로 서버로 단일 여행을하는 세션입니다.

# 1과 관련하여 Session 객체가 나타내는 모든 것에 액세스 할 수있는 속성이있는 강력한 형식의 Master View가 있습니다 …. 내 인스턴스에서 stongly typed Master View는 일반적으로 강력하게 형식화 된 View Pages와 관련하여 약간의 유연성을 제공합니다.

ViewMasterPage<AdminViewModel>

AdminViewModel
{
    SomeImportantObjectThatWasInSession ImportantObject
}

AdminViewModel<TModel> : AdminViewModel where TModel : class
{
   TModel Content
}

그리고…

ViewPage<AdminViewModel<U>>


답변

asp.net mvc에 대해서는 잘 모르지만 이것이 일반적인 .net 웹 사이트에서해야 할 일입니다. asp.net mvc에서도 작동합니다.

YourSessionClass obj=Session["key"] as YourSessionClass;
if(obj==null){
obj=new YourSessionClass();
Session["key"]=obj;
}

쉽게 접근 할 수 있도록 메소드 안에 넣을 것입니다. HTH


답변

3 가지 방법이 있습니다.

  1. 당신은 직접 액세스 할 수 있습니다 HttpContext.Current.Session

  2. 당신은 모의 할 수 있습니다 HttpContextBase

  3. 확장 방법 만들기 HttpContextBase

나는 세 번째 방법을 선호합니다.이 링크는 좋은 참조입니다.

BaseController의 HttpContext 세션 메소드 가져 오기 / 설정 및 HttpContextBase를 조롱하여 Get / Set 메소드 작성