【问题标题】:How to get session value asp.net core inside a view如何在视图中获取会话值 asp.net core
【发布时间】:2017-09-27 16:11:26
【问题描述】:

我正在尝试这样的会话

@HttpContext.Session.GetString("some");

但我得到了

*

非静态字段需要对象引用......

*

有人有想法吗?

【问题讨论】:

    标签: asp.net-mvc session-variables


    【解决方案1】:

    您必须将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();
    

    【讨论】:

    • @Navigator 只是为了添加@Shyju 的建议,IHttpContextAccessor 会起作用,但它可能会增加一些显着的性能开销(如报告的here),因此从ASP.NET Core 1.0 RC2 开始它不是默认注册,因此您需要按照@Shyju 的建议在Starup.cs 中进行一些配置。另一种解决方案是在顶部添加@using Microsoft.AspNetCore.Http,然后@HttpContext.Session.GetString("some"); 将起作用。
    • çox sağol(谢谢)@shyju
    • GetInt32 似乎不可用?需要添加@using Microsoft.AspNetCore.Http
    【解决方案2】:

    首先在启动类的 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 的答案。

    【讨论】:

      猜你喜欢
      • 2010-10-25
      • 1970-01-01
      • 2023-03-07
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2019-05-21
      相关资源
      最近更新 更多