web-dev-qa-db-ja.com

カミソリビュー.netコア2のセッション変数にアクセスする

.net core 2.0プロジェクトのカミソリビューでセッションストレージにアクセスしようとしています。 .net 2.0ビューに@Session ["key"]に相当するものはありますか?私はこれを行う方法の実例を見つけていません-私が見つけた方法を使用してこのエラーが発生しています:

オブジェクト参照は、非静的フィールド、メソッド、またはプロパティ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>
}

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

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>

セッションを有効にするStartup.csクラスに関連するコードがある場合、これは機能するはずです。

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

    });
}

コントローラーでセッションを設定するには、同じことを行います。 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はステートレスであることを忘れないでください。それにステートフルな振る舞いを追加するときは、正しい理由でそれを行っていることを確認してください。

22
Shyju

かみそりのページの一番上にこれを置きます

@using Microsoft.AspNetCore.Http;

そのようなセッション変数に簡単にアクセスできます

<h1>@Context.Session.GetString("MyAwesomeSessionValue")</h1>

null値を取得する場合は、必ずStartup.csに含めてください

&オプションを確認してください。CheckConsentNeeded=コンテキストはfalseに設定

CheckConsentNeededの詳細については、これを確認してください [〜#〜] gdpr [〜#〜]

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

また、Configure関数でアプリパイプラインにapp.UseSession();を追加していることを確認してください

asp.net Coreのセッションの詳細については、このリンクを確認してください Sessions in Asp.net Core

.net core 2.1でテスト済み

9
Mawardy

他の人が述べたように、私はここでの本当の解決策はこれを全くしないことだと思います。私はそれについて考えましたが、セッションを使用する正当な理由がありますが、かみそりタグは最初のページの読み込みにのみ有用であるため、コントローラーのビューモデルに保存されたセッション値を入力する方が理にかなっています。

その後、現在のセッション値を含むビューモデルをビューに渡し、代わりにモデルにアクセスできます。その後、ビューに何かを挿入する必要はありません。

2
Ella