2016-04-01 27 views
1

我試圖從數據庫中檢索一些數據並將其存儲在一些會話變量中,以便將它放在所有頁面的_Layout.cshtml中,而不管用戶從頭開始訪問哪個頁面。 Global.asax中:ASP.NET如何使用Sessions,何時何地聲明它?

protected void Application_Start() { ... Manager mng = new Manager(); HttpContext.Current.Session["company-cellphone"] = mng.GetContacts().CompanyCellphone; }

錯誤:異常詳細信息:System.NullReferenceException:對象不設置爲一個對象的一個​​實例。

+0

此代碼中的哪個元素爲空? –

+0

你的方法'GetContacts()'返回什麼?它看起來像是返回一個未初始化的對象。您需要檢查返回值並將其設置爲默認值,它返回空值 –

+0

GetContacts()返回模型。 – CodeBeginner

回答

1

您正試圖從Application_Start訪問會話,但沒有實時會話。

會議不是作爲一種解決方法的Global.asax

的所有事件可試試這個:

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) 
{ 
    if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState) 
    { 
      HttpContext context = HttpContext.Current; 
      ... 
      Manager mng = new Manager(); 
      HttpContext.Current.Session["company-cellphone"] = mng.GetContacts().CompanyCellphone; 
    } 
} 

我不知道你的要求,但我會建議訪問會話in controller.initialize method

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 
    //// access session here 
    requestContext.HttpContext.Session["company-cellphone"]=mng.GetContacts().CompanyCellphone; 
} 
+0

它在這兩個地方工作,謝謝,但你能解釋爲什麼在控制器更好,我需要做任何檢查之前訪問控制器中的會話? – CodeBeginner

0

Application_Start在可以創建任何會話之前運行。會話是特定於連接到您的應用程序的單個客戶端。

您可以創建一個靜態類並在其中存儲公司手機的值。

在您的Models文件夾中,在該文件中創建一個名爲Global.cs的新類文件創建一個靜態類,其中包含將保存應用程序級別信息的屬性。

public static class Global 
{ 
    static string companyCellPhone; 

    public static string companyCellPhone 
    { 
    get 
    { 
     return this.companyCellPhone; 
    } 
    set 
    { 
     this.companyCellPhone= value; 
    } 
} 

那麼你的Application_Start方法中會是這個樣子:

protected void Application_Start() 
{ 
    ... 
    Manager mng = new Manager(); 
    Global.companyCellPhone = mng.GetContacts().CompanyCellphone; 
} 
0

我要出去肢體和猜測,這是由所有用戶查看一個單一的全球價值。在這種情況下,你可以在值存儲在HttpApplicationState而非HttpSessionState:

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Start(object sender, EventArgs e) 
    { 
     Application["YourValue"] = "SomeValue"; 
    } 
} 

我並不提倡使用它。但就像Session可以存儲用戶特定的值一樣,Application存儲了應用程序全局的值。