web-dev-qa-db-fra.com

Accéder à la variable de session en vue rasoir .net core 2

J'essaie d'accéder au stockage de session dans une vue rasoir pour un projet .net core 2.0. Existe-t-il un équivalent pour @Session ["clé"] dans une vue .net 2.0? Je n'ai pas trouvé d'exemple pratique de la façon de procéder - je reçois cette erreur en utilisant les méthodes que j'ai trouvées:

Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique HttpContext.Session

Vue:

@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

Vous pouvez faire l'injection de dépendances dans les vues, dans ASP.NET Core 2.0 :)

Vous devez injecter l'implémentation IHttpContextAccessor dans votre vue et l'utiliser pour obtenir les objets HttpContext et Session à partir de cela.

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

Cela devrait fonctionner en supposant que vous avez le code approprié dans le Startup.cs classe pour activer la 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?}");

    });
}

Pour définir la session dans un contrôleur, vous faites la même chose. Injectez le IHttpContextAccessor à votre contrôleur et utilisez-le

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

tilisez la session de manière appropriée. Si vous essayez de transmettre des données spécifiques à la page en cours (par exemple, si les données de la grille sont filtrées ou non, ce qui est très spécifique à la demande en cours), vous ne devez pas utiliser la session pour cela. Pensez à utiliser un modèle de vue et à avoir une propriété dans celle que vous pouvez utiliser pour transmettre ces données. Vous pouvez toujours transmettre ces valeurs à des vues partielles en tant que données supplémentaires via le dictionnaire de données de vue, si nécessaire.

Rappelez-vous, Http est sans état. Lorsque vous ajoutez un comportement avec état à cela, assurez-vous de le faire pour la bonne raison.

22
Shyju

mettre cela en haut de la page du rasoir

@using Microsoft.AspNetCore.Http;

alors vous pouvez facilement accéder aux variables de session comme ça

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

si vous obtenez des valeurs nulles, assurez-vous de l'inclure dans votre Startup.cs

& assurez-vous que les options. CheckConsentNeeded = le contexte est défini sur false

Pour plus d'informations sur CheckConsentNeeded, vérifiez ceci 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;
            });
        }

Assurez-vous également que vous ajoutez app.UseSession (); à votre pipeline d'applications dans la fonction Configure

pour plus d'informations sur les sessions dans Asp.net Core, consultez ce lien Sessions dans Asp.net Core

testé sur .net core 2.1

9
Mawardy

Comme d'autres l'ont mentionné, je pense que la vraie solution ici n'est pas de le faire du tout. J'y ai pensé, et bien que j'aie une bonne raison d'utiliser la session, puisque les balises de rasoir ne sont utiles que pour le chargement de page initial, il est plus logique de simplement remplir le modèle de vue dans le contrôleur avec les valeurs de session stockées.

Vous pouvez ensuite transmettre le modèle de vue avec les valeurs de session en cours à votre vue et accéder à votre modèle à la place. Ensuite, vous n'avez rien à injecter dans votre vue.

2
Ella