Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不访问每个控制器中的HttpContext的情况下,如何使会话变量对所有控制器可用?_C#_Session_Asp.net Core Mvc_Httpcontext - Fatal编程技术网

C# 在不访问每个控制器中的HttpContext的情况下,如何使会话变量对所有控制器可用?

C# 在不访问每个控制器中的HttpContext的情况下,如何使会话变量对所有控制器可用?,c#,session,asp.net-core-mvc,httpcontext,C#,Session,Asp.net Core Mvc,Httpcontext,我试图通过使用HttpContext.Session.GetInt32(“BranchId”).Value,使int变量BranchId在我的应用程序中可用 根据我自己的尝试和对的回答,这种方法不起作用: 基本控制器类: using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace Vaktliste.Controllers { public class MyBaseControllerClass

我试图通过使用
HttpContext.Session.GetInt32(“BranchId”).Value,使
int
变量
BranchId
在我的应用程序中可用

根据我自己的尝试和对的回答,这种方法不起作用:

基本控制器类:

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;
        }
    }
}
使用Microsoft.AspNetCore.Http;
使用Microsoft.AspNetCore.Mvc;
命名空间Vaktliste.Controllers
{
公共类MyBaseControllerClass:控制器
{
公共只读文件;
公共MyBaseControllerClass()
{
var s=HttpContext.Session;//m.Id==Id)
.FirstOrDefaultAsync();
if(branch==null)返回NotFound();
HttpContext.Session.SetInt32(“BranchId”,branch.Id);
返回视图(分支);
}
}
}

当然,我可以在每个控制器中执行
GetInt32(“BranchId”)
,但我希望保持干燥(不要重复)。如何做到这一点?

也许您可以通过一个属性来实现这一点。创建basecontroller时,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);
        }
    }
}
namespace-Vaktliste.Controllers
{
公共类BranchesController:MyBaseControllerClass
{
私有只读VaktListContext数据库;
公共BranchesController(VaktListContext上下文)
{
db=上下文;
}
公共异步任务详细信息(int?id)
{
//在此处使用变量:
id=id??BranchId;
if(id==null)返回NotFound();
var branch=等待数据库分支
.其中(m=>m.Id==Id)
.FirstOrDefaultAsync();
if(branch==null)返回NotFound();
BranchId=branch.Id;
返回视图(分支);
}
}
}

我会制作一个
受保护的
变量,然后用它来包装访问者:

protected int? BranchId
{
   get { return (HttpContext.Session["BranchId] as int?); }
   set { HttpContext.Session.SetInt32("BranchId", value);
}
然后将从第二行到最后一行更新为:

this.BranchId=branch.Id


当然,所有子类控制器都只访问受保护的变量。

您可以在基类中将分支id设为惰性,然后在请求期间(而不是构造函数)它将可用。
protected int? BranchId
{
   get { return (HttpContext.Session["BranchId] as int?); }
   set { HttpContext.Session.SetInt32("BranchId", value);
}