Переменная сеанса в поле зрения - PullRequest
0 голосов
/ 06 мая 2018

Некоторое время назад я создал просто логин с сессией. Это было приложение MVC, но с .net framework 4.6, если я прав. И я мог бы там использовать что-то вроде

<h2>@Session["ID"]</h2>

И идентификатор из переменной сеанса должен быть в теге h2. Но сейчас я пытаюсь собрать то же самое, но с .net core 2.0.

Мой startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddDbContext<L2Context>(options =>
            options.UseSqlite("Data Source=test.db"));

    services.AddDistributedMemoryCache(); // Adds a default in-memory implementation of IDistributedCache
    services.AddSession(options => {
        options.IdleTimeout = TimeSpan.FromMinutes(30);
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();
    app.UseSession();

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

Контроллер для сохранения данных в сеансе:

[HttpPost]
public IActionResult Login(Users user)
{
    var optionsBuilder = new DbContextOptionsBuilder<L2Context>();
    optionsBuilder.UseSqlite("Data Source=test.db");

    using (L2Context db = new L2Context(optionsBuilder.Options))
    {
        var user = db.Users.Single(u => u.Login == user.Login && u.Password == user.Password);
        if (user != null)
        {
            HttpContext.Session.SetString("ID", user.ID.ToString());
            HttpContext.Session.SetString("Login", user.Login.ToString());
            return RedirectToAction(nameof(LoggedIn));
        }
        else
        {
            ModelState.AddModelError("", "Login or password is invalid");
        }
    }
    return View();
}

Просмотр входа в систему:

@{
    ViewData["Title"] = "LoggedIn";
}

<h4> Hello @Session["Login"]</h4>

Итак, у меня есть какая-то ошибка здесь? Я жестко работал в прошлый раз, когда использовал его.

Я получаю:

ошибка CS0103: имя 'Session' не существует в текущем контексте

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Есть несколько отличий между .NET Core 2.0 и .NET 4.6.Одним из них является то, что в .NET Core 2.0 у вас нет доступного свойства Session.Получить сеанс можно, используя свойство контекста HttpContext.

Это должно работать:

@{
    ViewData["Title"] = "LoggedIn";
}

<h4> Hello @Context.Session["Login"]</h4>
0 голосов
/ 07 мая 2018

Есть еще один способ сделать это. С ним вам не нужно грабить сессию. Я расскажу вам, как я это сделал.

Шаг 1 Создайте постоянный файл, который мы будем использовать в наших представлениях позже

using System;

namespace MyProject.CONSTANTS
{
    public static class Constants
    {
        public static String USER_ENTITY
        {
            get
            {
                return "USER_ENTITY";
            }
        }
    }
}

Шаг 2 Создайте класс уровня приложения AppUser.cs и интерфейс для того же IAppUser

namespace MyProject.Configurations.Interface
{
    public interface IAppUser
    {
        UserDto UserEntity { get; }
    }
}

и

namespace MyProject.Configurations
{
    public class AppUser : IAppUser
    {
        private IHttpContextAccessor httpContextProvider;

        public AppUser(IHttpContextAccessor _httpContextProvider)
        {
            httpContextProvider = _httpContextProvider;
        }

        public UserDto UserEntity
        {
            get
            {
                return httpContextProvider.HttpContext.Session.Get<UserDto>(Constants.USER_ENTITY);
            }
        }
    }
}

Шаг 3 Теперь, когда вы получите данные, сохраните их как показано ниже

HttpContext.Session.Set(Constants.USER_ENTITY, result); //here result is type of `UserDto.cs` class

Что мы сделали выше

Мы сохранили наш сеанс в константах, которые мы будем использовать в представлениях позже с внедрением зависимостей.

Шаг 4 У нас есть общее представление _viewImports.cshtml, в котором есть все внедрения зависимостей.

Мы добавим наш интерфейс IAppUser в это представление, которое теперь доступно для всех представлений.

в _viewImports.cshtml выполните следующие действия -

@using MyProject
@using Microsoft.Extensions.Options;
@inject MyProject.Configurations.Interface.IAppUser AppUser  //AppUser is an aleas

Теперь в любом представлении вы можете использовать свойства интерфейса IAppUser, который разрешен с помощью класса AppUser.cs.

Скажите, если UserDto.cs имеет свойство как

public int ID {get;set;}

Вы можете использовать его как - @AppUser.UserEntity.ID

Вот и все

0 голосов
/ 06 мая 2018

В ASP.NET Core представление не имеет доступа к свойству Session объекта HttpContext по умолчанию. Вы можете получить к нему доступ, импортировав пространство имен Http в представлении:

//import the namespace to make the class available within the view
@using Microsoft.AspNetCore.Http

Затем вы можете получить доступ к свойству Session объекта HttpContext:

<h4> Hello @HttpContext.Session.GetString("Login")</h4>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...