首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ASP.NET核心控制器中使用全局变量

在ASP.NET核心控制器中使用全局变量
EN

Stack Overflow用户
提问于 2017-09-29 14:01:31
回答 1查看 20.3K关注 0票数 4

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

例如,有一个控制器

代码语言:javascript
复制
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(整型变量的默认值)。我不知道Controller页面(Controller类)总是在我生成它时被初始化,即使我移动到相同的页面。

所以,我想使用像全局变量一样的变量,而不是使用会话。

有什么办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-29 14:20:00

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

每用户

如果希望存储持久存在但仅对当前用户可见的变量,请使用session state

代码语言:javascript
复制
public int? A
{
    get 
    {
        return HttpContext.Current.Session["A"] as int?;
    }
    set
    {
        HttpContext.Current.Session["A"] = value;
    }
}

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

真正的全球化

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

所以要么

代码语言:javascript
复制
static volatile public int a;

代码语言:javascript
复制
public int? A
{
    get 
    {
        return HttpContext.Current.Application["A"] as int?;
    }
    set
    {
        HttpContext.Current.Application["A"] = value;
    }
}

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

您不需要担心会话变量的线程同步;框架会为您处理它。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46482614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档