我正在尝试从db中检索一些数据,并将其存储为一些Session变量,以便在所有页面上的_Layout.cshtml中使用它,无论用户从一开始访问哪个页面。 Global.asax中:
protected void Application_Start()
{
...
Manager mng = new Manager();
HttpContext.Current.Session["company-cellphone"] = mng.GetContacts().CompanyCellphone;
}
错误:异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。
答案 0 :(得分: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;
}
}
我不确定您的要求,但我建议您在controller.initialize方法中访问会话
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
//// access session here
requestContext.HttpContext.Session["company-cellphone"]=mng.GetContacts().CompanyCellphone;
}
答案 1 :(得分: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;
}
答案 2 :(得分:0)
我将走出困境,并猜测这是一个可被所有用户查看的全局值。在这种情况下,您可以将值存储在HttpApplicationState
而不是HttpSessionState:
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
Application["YourValue"] = "SomeValue";
}
}
我不一定主张使用它。但正如Session
可以存储特定于用户的值,Application
存储应用程序的全局值。