Как сделать переменную сеанса доступной для всех контроллеров, не обращаясь к HttpContext в каждом контроллере? - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь сделать переменную int BranchId доступной через мое приложение с помощью HttpContext.Session.GetInt32("BranchId").Value.

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

Базовый класс контроллера:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Vaktliste.Controllers
{
    public class MyBaseControllerClass : Controller
    {
        public readonly int branchId;

        public MyBaseControllerClass()
        {
            var s = HttpContext.Session; // <-- This causes a NULL exception
            // SET THE VARIABLE HERE:
            BranchId = s.GetInt32("BranchId") != null
                ? s.GetInt32("BranchId").Value
                : 0;
        }
    }
}

Пример другого контроллера в приложении:

namespace Vaktliste.Controllers
{
    public class BranchesController : MyBaseControllerClass
    {
        private readonly VaktlisteContext db;

        public BranchesController(VaktlisteContext context)
        {
            db = context;
        }

        public async Task<IActionResult> Details(int? id)
        {
            // USE THE VARIABLE HERE:
            if (id == null) id = BranchId;

            if (id == null) return NotFound();

            var branch = await db.Branches
                .Where(m => m.Id == id)
                .FirstOrDefaultAsync();

            if (branch == null) return NotFound();

            HttpContext.Session.SetInt32("BranchId", branch.Id);

            return View(branch);
        }
    }
}

Конечно, я мог бы сделать GetInt32("BranchId") на каждом контроллере, но я хочу, чтобы он оставался СУХИМ (не повторяйте себя).Как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Я бы сделал protected переменную и просто использовал бы ее, чтобы обернуть ваш метод доступа:

protected int? BranchId
{
   get { return (HttpContext.Session["BranchId] as int?); }
   set { HttpContext.Session.SetInt32("BranchId", value);
}

Затем обновите вашу вторую до последней строки как:

this.BranchId = branch.Id;

И, конечно, все контроллеры подклассов просто получают доступ к защищенной переменной.

0 голосов
/ 19 декабря 2018

Возможно, вы сможете достичь этого с помощью свойства.Когда базовый контроллер создан, httpcontext.session имеет значение null.Если вы используете свойство и обращаетесь к нему только в своих маршрутах, сеанс должен быть доступен.

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Vaktliste.Controllers
{
    public class MyBaseControllerClass : Controller
    {
        public readonly int branchId;
        protected int BranchId { 
            get { HttpContext.Session?.GetInt32("BranchId")?.Value ?? 0; }
            set { HttpContext.Session.SetInt32("BranchId", value); }
        }

        public MyBaseControllerClass()
        {

        }
    }
}

Затем просто получите доступ к свойству, чтобы получить значение

namespace Vaktliste.Controllers
{
    public class BranchesController : MyBaseControllerClass
    {
        private readonly VaktlisteContext db;

        public BranchesController(VaktlisteContext context)
        {
            db = context;
        }

        public async Task<IActionResult> Details(int? id)
        {
            // USE THE VARIABLE HERE:
            id = id ?? BranchId;

            if (id == null) return NotFound();

            var branch = await db.Branches
                .Where(m => m.Id == id)
                .FirstOrDefaultAsync();

            if (branch == null) return NotFound();

            BranchId = branch.Id;

            return View(branch);
        }
    }
}
...