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);
}