Магазин сессий IQueryable в HttpContext - PullRequest
1 голос
/ 20 марта 2019

Я мигрирую проект из Net MVC в MVC Core 2.

Как настроить IQueryable в сеансах? В Net MVC это было следующим,

    public ActionResult CurrentOwners_Read([DataSourceRequest]DataSourceRequest request, int propertyID)
    {
        if (propertyID == 0)
        {
            throw new ArgumentNullException("propertyID");
        }

        IQueryable<PropertyOwnerRoleViewModel> allResult = (IQueryable<PropertyOwnerRoleViewModel>)HttpContext.Session.GetString(_currentOwnersResult).AsQueryable();

        if (allResult == null)
        {
            PropertyOwnerManager propertyOwnerManager = new PropertyOwnerManager();
            allResult = propertyOwnerManager.GetPropertyOwnershipSummary(propertyID).AsQueryable();
            Session.Add(_currentOwnersResult, allResult);  
        }

В последней строке выдается ошибка:

The name 'Session' does not exist in the current context

_currentOwnersResult is string AllResult IQueryable

При попытке конвертировать в MVC Core, следующее тоже не работает

HttpContext.Session.SetString(_currentOwnersResult, allResult);

Код ошибки:

cannot convert from 'System.Linq.IQueryable<HPE.Kruta.Model.PropertyOwnerRoleViewModel>' to 'string'    

1 Ответ

2 голосов
/ 20 марта 2019

Хорошо, в качестве базового примера того, как настроить сложный объект в вашем сеансе в .NET Core:

Сначала настройте ваш сеанс:

В вашем файле Startup.cs подСконфигурируйте метод, добавьте следующую строку:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSession();
}

А в метод ConfigureServices добавьте следующую строку:

public void ConfigureServices(IServiceCollection services)
{
  //Added for session state
  services.AddDistributedMemoryCache();

  services.AddSession(options =>
  {
  options.IdleTimeout = TimeSpan.FromMinutes(10);               
  });
}

Чтобы добавить сложные объекты из вашего списка в ваш сеанс (обратите вниманиечто это только пример и не относится к вашему случаю, так как я не знаю, что такое определение PropertyOwnerRoleViewModel):

Модель:

public class EmployeeDetails
{
    public string EmployeeId { get; set; }
    public string DesignationId { get; set; }
}

public class EmployeeDetailsDisplay
{
    public EmployeeDetailsDisplay()
    {
        details = new List<EmployeeDetails>();
    }
    public List<EmployeeDetails> details { get; set; }
}

Затем создайте помощник SessionExtension для установки и извлечения вашего комплекса.объект как JSON:

public static class SessionExtensions
        {
            public static void SetObjectAsJson(this ISession session, string key, object value)
            {
                session.SetString(key, JsonConvert.SerializeObject(value));
            }

            public static T GetObjectFromJson<T>(this ISession session, string key)
            {
                var value = session.GetString(key);

                return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
            }
        }

Добавление этого сложного объекта в ваш сеанс:

 //Create complex object
 var employee = new EmployeeDetailsDisplay();

 employee.details.Add(new EmployeeDetails
 {
 EmployeeId = "1",
 DesignationId = "2"
 });

 employee.details.Add(new EmployeeDetails
 {
 EmployeeId = "3",
 DesignationId = "4"
 });
//Add to your session
HttpContext.Session.SetObjectAsJson("EmployeeDetails", employee);

И, наконец, для получения ваших сложных объектов из вашего сеанса:

var employeeDetails = HttpContext.Session.GetObjectFromJson<EmployeeDetailsDisplay>("EmployeeDetails");

//Get list of all employee id's
List<int> employeeID = employeeDetails.details.Select(x => Convert.ToInt32(x.EmployeeId)).ToList();
//Get list of all designation id's
List<int> designationID= employeeDetails.details.Select(x=> Convert.ToInt32(x.DesignationId)).ToList();
...