gpt4 book ai didi

asp.net-core - 在 ASP.NET Core Controller 中使用全局变量

转载 作者:行者123 更新时间:2023-12-03 22:21:50 24 4
gpt4 key购买 nike

问题很简单,但我不知道如何使用它。

例如有一个 Controller

public class MainController : Controller
{
private int a;

public IActionResult Index(bool set = true)
{
if (set) a = 10;

return View(a)
}
}

如果我第一次进入索引页面,我设置 a = 10。然后我再次进入索引页面(例如刷新索引页面或在索引页面中分页,即在同一页面中移动)实际上,我进入带有 url 的索引页面: ~Index?set=False第一次访问后。

然后是 a有 0(int 变量的默认值)。我不知道 Controller 页面( Controller 类)在我生成时总是被初始化,即使我移动到同一页面。

所以,我想使用不使用 session 的全局变量之类的变量。

有什么办法吗?

最佳答案

听起来您希望在请求之间保留一个变量。

每个用户

如果你想存储一个持续存在但只对当前用户可见的变量,使用 session state :

public int? A
{
get
{
return HttpContext.Current.Session["A"] as int?;
}
set
{
HttpContext.Current.Session["A"] = value;
}
}

请注意,我们使用的是 int?而不是 int为了处理尚未设置 session 变量的情况。如果你更喜欢默认为 0,你可以简单地使用 the coalesce operator, ?? .

真正全局化

如果您希望以一种所有用户只有一个副本的方式持久化变量,您可以将其存储在静态变量或应用程序状态变量中。

所以要么
static volatile public int a;

或者
public int? A
{
get
{
return HttpContext.Current.Application["A"] as int?;
}
set
{
HttpContext.Current.Application["A"] = value;
}
}

显然,用户之间共享的变量可以随时更改(由于其他线程中的事件),因此您应该小心处理它们。对于 int 的变量-size 或更小,处理器将执行原子读写,但对于大于 int 的变量您可能需要使用 Interlockedlock来控制访问。

您无需担心 session 变量的线程同步;框架会为您处理。

注意:以上只是帮助您找到正确 API 的示例。它不一定展示最佳模式——通过静态方法访问 HttpContext Current被认为是不好的形式,因为它不可能模拟上下文。请查看 this article了解通过 DI 将其公开给您的代码的方法。

关于asp.net-core - 在 ASP.NET Core Controller 中使用全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46482614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com