【发布时间】:2017-09-27 16:11:26
【问题描述】:
我正在尝试这样的会话
@HttpContext.Session.GetString("some");
但我得到了
*
非静态字段需要对象引用......
*
有人有想法吗?
【问题讨论】:
标签: asp.net-mvc session-variables
我正在尝试这样的会话
@HttpContext.Session.GetString("some");
但我得到了
*
非静态字段需要对象引用......
*
有人有想法吗?
【问题讨论】:
标签: asp.net-mvc session-variables
您必须将IHttpContextAccessor 实现注入视图并使用它。
@using Microsoft.AspNetCore.Http
@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
现在您可以访问HttpContext 属性,然后访问Session
<p>
@HttpContextAccessor.HttpContext.Session.GetInt32("MySessionKey")
</p>
假设您已完成所有必要的设置以启用 startup 类中的会话。
在您的 ConfigureServices 方法中,
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
在Configure方法中调用IApplicationBuilder.UseSession方法。
app.UseSession();
【讨论】:
@Shyju 的建议,IHttpContextAccessor 会起作用,但它可能会增加一些显着的性能开销(如报告的here),因此从ASP.NET Core 1.0 RC2 开始它不是默认注册,因此您需要按照@Shyju 的建议在Starup.cs 中进行一些配置。另一种解决方案是在顶部添加@using Microsoft.AspNetCore.Http,然后@HttpContext.Session.GetString("some"); 将起作用。
首先在启动类的 ConfigureServices 方法中添加以下两行代码来启用会话:
services.AddMemoryCache();
services.AddSession();
在同一方法中添加创建单例对象的代码,以便 IHttpContextAccessor 访问视图中的会话。
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
现在在启动类的 Configure 方法中,您必须在 .UseMvc() 之前添加 .UseSession():
app.UseSession();
Startup类的完整代码如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddMemoryCache();
services.AddSession();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseStatusCodePages();
app.UseStaticFiles();
app.UseSession();
app.UseMvc(routes =>
{
// Default Route
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
然后转到视图并在顶部添加以下2行:
@using Microsoft.AspNetCore.Http
@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
然后您可以从视图中的会话变量中获取值,例如:
@HttpContextAccessor.HttpContext.Session.GetString("some")
我只是通过包含完整代码修改了@Shyju 的答案。
【讨论】: