wake-up-neo.com

Greifen Sie auf die Sitzungsvariable in der Razor View .NET Core 2 zu

Ich versuche, für ein .NET Core 2.0-Projekt in einer gestochen scharfen Ansicht auf den Sitzungsspeicher zuzugreifen. Gibt es eine Entsprechung für @Session ["Schlüssel"] in einer .NET 2.0-Ansicht? Ich habe kein funktionierendes Beispiel dafür gefunden - ich erhalte diesen Fehler mit den Methoden, die ich gefunden habe:

Für das nicht statische Feld, die Methode oder die Eigenschaft HttpContext.Session ist eine Objektreferenz erforderlich

Aussicht:

@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

Sie können das Einfügen von Abhängigkeiten in Ansichten in ASP.NET Core 2.0 durchführen :)

Sie sollten die Implementierung von IHttpContextAccessor in Ihre Ansicht einfügen und sie verwenden, um das Objekt HttpContext und Session daraus abzurufen.

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

Dies sollte funktionieren, vorausgesetzt, Sie haben den entsprechenden Code in der Startup.cs Klasse zum Aktivieren der Sitzung.

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

    });
}

Um eine Sitzung in einem Controller einzurichten, gehen Sie genauso vor. Injizieren Sie den IHttpContextAccessor in Ihren Controller und verwenden Sie diesen

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

Sitzung entsprechend verwenden. Wenn Sie versuchen, bestimmte Daten für die aktuelle Seite zu übergeben (z. B. ob die Rasterdaten gefiltert werden oder nicht, was für die aktuelle Anforderung sehr spezifisch ist), sollten Sie für diese Sitzung keine verwenden. Ziehen Sie die Verwendung eines Ansichtsmodells in Betracht und verfügen Sie über eine Eigenschaft, mit der Sie diese Daten übergeben können. Sie können diese Werte jederzeit nach Bedarf als zusätzliche Daten über das View Data Dictionary an Teilansichten übergeben.

Denken Sie daran, HTTP ist zustandslos. Stellen Sie sicher, dass Sie dies aus dem richtigen Grund tun, wenn Sie zustandsbehaftetes Verhalten hinzufügen.

22
Shyju

setzen Sie dies oben auf die Rasiermesserseite

@using Microsoft.AspNetCore.Http;

dann können Sie einfach auf solche Sitzungsvariablen zugreifen

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

wenn Sie Nullwerte erhalten, stellen Sie sicher, dass Sie das in Ihrem Startup.cs enthalten

& Stellen Sie sicher, dass die Optionen CheckConsentNeeded = context auf false gesetzt sind.

Weitere Informationen zu CheckConsentNeeded finden Sie unter 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;
            });
        }

Stellen Sie außerdem sicher, dass Sie Ihrer App-Pipeline in der Funktion "Konfigurieren" app.UseSession (); hinzufügen

weitere Informationen zu Sitzungen in Asp.net Core finden Sie unter diesem Link Sitzungen in Asp.net Core

getestet auf .net Core 2.1

9
Mawardy

Wie andere bereits erwähnt haben, denke ich, besteht die wirkliche Lösung darin, dies überhaupt nicht zu tun. Ich habe darüber nachgedacht, und obwohl ich einen guten Grund habe, die Sitzung zu verwenden, ist es sinnvoller, das Ansichtsmodell im Controller nur mit den gespeicherten Sitzungswerten zu füllen, da die Rasiermessertags ohnehin nur für das anfängliche Laden der Seite nützlich sind.

Sie können dann das Ansichtsmodell mit den aktuellen Sitzungswerten an Ihre Ansicht übergeben und stattdessen auf Ihr Modell zugreifen. Dann müssen Sie Ihrer Ansicht nichts mehr hinzufügen.

2
Ella