asp.net-mvc - 在razor View .net core 2中访问 session 变量

标签 asp.net-mvc razor asp.net-core asp.net-core-2.0

我正在尝试在 .net core 2.0 项目的 razor View 中访问 session 存储。 .net 2.0 View 中是否有 @Session["key"] 的等效项?我还没有找到如何执行此操作的有效示例 - 我使用我找到的方法收到此错误:

An object reference is required for the non-static field, method, or propery HttpContext.Session

查看:

@using Microsoft.AspNetCore.Http

[HTML button that needs to be hidden/shown based on trigger]

@section scripts {
<script>
    var filteredResults = '@HttpContext.Session.GetString("isFiltered")';
</script>
}

启动.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?}");
        });
    }

最佳答案

您可以在 ASP.NET Core 2.0 中的 View 中进行依赖项注入(inject):)

您应该将 IHttpContextAccessor 实现注入(inject)到您的 View 中,并使用它从中获取 HttpContextSession 对象。

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
<script>
   var isFiltered = '@HttpContextAccessor.HttpContext.Session.GetString("isFiltered")';
   alert(isFiltered);
</script>

假设您在 Startup.cs 类中有相关代码来启用 session ,这应该可以工作。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSession(s => s.IdleTimeout = TimeSpan.FromMinutes(30));
    services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSession(); 

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");

    });
}

要在 Controller 中设置 session ,您需要执行相同的操作。将 IHttpContextAccessor 注入(inject)您的 Controller 并使用它

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");
   }
}

适当使用 session 。如果您试图传递一些特定于当前页面的数据(例如:网格数据是否被过滤,这对于当前请求来说是非常特定的),那么您不应该使用 session 。考虑使用 View 模型并拥有可用于传递此数据的属性。您始终可以根据需要通过 View 数据字典将这些值作为附加数据传递给部分 View 。

请记住,Http 是无状态的。向其中添加有状态行为时,请确保您这样做是出于正确的原因。

关于asp.net-mvc - 在razor View .net core 2中访问 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46921275/

相关文章:

javascript - 在 JavaScript 中使用 Razor

sql-server - 我无法从 Visual Studio 2019 登录 Azure 服务

c# - ASP.net Core MVC 登录

c# - 如何使用 MVC AJax.BeginForm 传递动态值

c# - 动态设置 OWIN 重定向 uri

css - 如何更改 Razor View 中第一个字母的颜色?

c# - 无法访问 session asp.net 核心

javascript - 如何将 Segment.io 服务器和客户端事件连接到同一个匿名用户?

asp.net - 将附加属性添加到 Entity Framework 4编码第一个CTP 5实体

javascript - 将 Razor 页面显示为模式弹出窗口