Asp.net mvc razor view.net core 2中的Access会话变量

Asp.net mvc razor view.net core 2中的Access会话变量,asp.net-mvc,razor,asp.net-core,asp.net-core-2.0,Asp.net Mvc,Razor,Asp.net Core,Asp.net Core 2.0,我正在尝试在一个.NETCore2.0项目的razor视图中访问会话存储。在.net 2.0视图中,@Session[“key”]是否有任何等效项?我还没有找到一个如何做到这一点的工作示例-我使用我找到的方法得到这个错误: 非静态字段、方法或Property HttpContext.Session需要对象引用 视图: 使用Microsoft.AspNetCore.Http [需要根据触发器隐藏/显示的HTML按钮] @节脚本{ var filteredResults='@HttpContext.

我正在尝试在一个.NETCore2.0项目的razor视图中访问会话存储。在.net 2.0视图中,@Session[“key”]是否有任何等效项?我还没有找到一个如何做到这一点的工作示例-我使用我找到的方法得到这个错误:

非静态字段、方法或Property HttpContext.Session需要对象引用

视图:

使用Microsoft.AspNetCore.Http [需要根据触发器隐藏/显示的HTML按钮] @节脚本{ var filteredResults='@HttpContext.Session.GetString(“isFiltered”); } Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddSession(options => {
            options.IdleTimeout = TimeSpan.FromMinutes(30);
        });

        services.AddMvc();

        // Added - uses IOptions<T> for your settings.
        // Added - replacement for the configuration manager
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //exception handler stuff
        //rewrite http to https
        //authentication
        app.UseSession();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
public void配置服务(IServiceCollection服务)
{
services.AddSession(选项=>{
options.IdleTimeout=TimeSpan.FromMinutes(30);
});
services.AddMvc();
//添加-将IOPS用于您的设置。
//添加-更换configuration manager
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
//异常处理程序
//将http重写为https
//认证
app.UseSession();
app.UseMvc(路由=>
{
routes.MapRoute(
名称:“默认”,
模板:“{controller=Home}/{action=Index}/{id?}”);
});
}

您可以在ASP.NET Core 2.0的视图中执行依赖项注入:)

您应该将
IHttpContextAccessor
实现注入到视图中,并使用它从视图中获取
HttpContext
Session
对象

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
<script>
   var isFiltered = '@HttpContextAccessor.HttpContext.Session.GetString("isFiltered")';
   alert(isFiltered);
</script>
要在控制器中设置会话,请执行相同的操作。将
IHttpContextAccessor
注入控制器并使用它

public class HomeController : Controller
{
   private readonly ISession session;
   public HomeController(IHttpContextAccessor httpContextAccessor)
   {
      this.session = httpContextAccessor.HttpContext.Session;
   }
   public IActionResult Index()
   {
     this.session.SetString("isFiltered","YES");
     return Content("This action method set session variable value");
   }
}
适当地使用会话。如果您试图传递特定于当前页面的某些数据(例如:是否过滤网格数据,这对于当前请求非常特定),则不应为此使用会话。考虑使用视图模型,并拥有一个属性,您可以使用该属性来传递该数据。您始终可以根据需要通过视图数据字典将这些值作为附加数据传递给局部视图


请记住,Http是无状态的。在添加有状态行为时,请确保您这样做的理由是正确的。

正如其他人所提到的,我认为真正的解决方案是根本不这样做。我考虑过了,虽然我有很好的理由使用会话,但因为razor标记只对初始页面加载有用,所以用存储的会话值填充控制器中的视图模型更有意义


然后,可以将具有当前会话值的视图模型传递给视图,并改为访问模型。这样,您就不必向视图中注入任何内容。

将其放在页面顶部

@using Microsoft.AspNetCore.Http;
然后您就可以轻松地访问这样的会话变量

<h1>@Context.Session.GetString("MyAwesomeSessionValue")</h1>
@Context.Session.GetString(“MyAwesomeSessionValue”)
如果得到空值,请确保在Startup.cs中包含该值

&确保选项。checkApproveRequired=上下文设置为false

有关检查同意的更多信息,请检查此

public void配置服务(IServiceCollection服务)
{
配置(选项=>
{
//此lambda确定给定请求是否需要非必要cookie的用户同意。
//options.checkApprovered=context=>true;
options.checkApprovered=context=>false;
options.MinimumSameSitePolicy=SameSiteMode.None;
});
AddDistributedMemoryCache();
services.AddSession(选项=>
{
//设置会话超时值
options.IdleTimeout=TimeSpan.FromSeconds(30);
options.Cookie.HttpOnly=true;
});
}
还要确保您正在添加app.UseSession()在“配置”功能中添加到应用程序管道

有关Asp.net Core中会话的更多信息,请查看此链接


在.net core 2.1上测试

为什么要直接从视图访问会话?在大多数情况下,ViewModel应该包含视图的所有相关数据。控制器应该从会话中填充ViewModel…经过几天的重新思考,我意识到这并不像我最初认为的那样复杂,只是从控制器中的会话存储中填充了视图模型。我明白了。现在,您还可以在浏览器中缓存内容,并通过ajax调用发送。但是如果不知道您的具体用例,我无法告诉您如何/做什么。正如我所提到的,我并不是说它不好。但请确保你使用它的理由是正确的。我考虑了几天,意识到我把情况复杂化了。我认为会话在这种特定情况下仍然有用,但我可以将值传递给控制器中的视图模型,因为它在任何情况下都只影响页面的初始状态。不过,感谢您的帮助。TLDR:services.AddSingleton();当使用最新的dotnet版本时,阅读它对我不起作用。我必须添加服务;在ConfigureServices方法(Startup.cs)中,此答案对我有效,但接受的答案无效。
@using Microsoft.AspNetCore.Http;
<h1>@Context.Session.GetString("MyAwesomeSessionValue")</h1>
public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                //options.CheckConsentNeeded = context => true;
                options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });


            services.AddDistributedMemoryCache();

            services.AddSession(options =>
            {
                // Set session timeout value
                options.IdleTimeout = TimeSpan.FromSeconds(30);
                options.Cookie.HttpOnly = true;
            });
        }