Почему я не могу сохранить объект в сеансе - PullRequest
0 голосов
/ 15 апреля 2020
_httpContext.Session["HistoryviewModel"] = viewModel;

моя ошибка:

Ошибка CS0021 Невозможно применить индексирование с [] к выражению типа 'ISession'

1 Ответ

1 голос
/ 16 апреля 2020

Когда вы работаете с приложением ASP.NET Core и вам необходимо сохранить в сеансе экземпляр вашего настроенного типа, рассмотрите следующее решение. Решение протестировано с приложением ASP.NET Core MVC:

  1. В файле Startup.cs добавьте метод Configure для переменной app типа IApplicationBuilder этот код:

    app.UseSession();
    
  2. Зарегистрируйте службу для сеансов в файле Startup.cs, в методе ConfigureServices, используя переменную services:

    services.AddSession(); 
    
  3. Установка с использованием NuGet пакета System.Text.Json

  4. В моем приложении ASP.NET Core, в файле cs с контроллерами MVC, я add:

    using System.Text.Json;
    using Microsoft.AspNetCore.Http;
    

    В этом файле в пространство имен с контроллерами MVC я добавляю следующий тип, который будет выполнять необходимые действия для установки и получения моего объекта из сеанса:

    public static class SessionExtensions
    {
        public static void SetObjectAsJson<T>(this ISession session, string key, T value)
        {
            session.SetString(key, JsonSerializer.Serialize<T>(value));
        }
    
        public static object GetObjectFromJson<T>(this ISession session, string key)
        {
            var value = session.GetString(key);
            return value == null ? default(T) : JsonSerializer.Deserialize<T>(value);
        }
    }
    

    Кроме того, я добавляю пользовательский тип, который буду сохранять в сеансе:

    public class MyClass {
        public int MyInt { get; set; }
        public string MyString { get; set; }
    }
    

    Теперь в первом контроллере я помещаю в сеанс экземпляр пользовательского типа:

      var myComplexObject = new MyClass();
      myComplexObject.MyInt = 1;
      myComplexObject.MyString = "Hello World!";
      HttpContext.Session.SetObjectAsJson<MyClass>("Test", myComplexObject);
    

    Во втором контроллере я получаю этот экземпляр из сеанса:

    var myComplexObject = HttpContext.Session.GetObjectFromJson<MyClass>("Test");
    

Надеюсь, это решение поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...