这个问题很简单,但我不知道如何使用它。
例如,有一个控制器
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类)总是在我生成它时被初始化,即使我移动到相同的页面。
所以,我想使用像全局变量一样的变量,而不是使用会话。
有什么办法吗?
发布于 2017-09-29 14:20:00
听起来您希望在请求之间保持一个变量。
每用户
如果希望存储持久存在但仅对当前用户可见的变量,请使用session state
public int? A
{
get
{
return HttpContext.Current.Session["A"] as int?;
}
set
{
HttpContext.Current.Session["A"] = value;
}
}请注意,我们使用int?而不是int来处理尚未设置会话变量的情况。如果您更喜欢默认为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-sized或更小的变量,处理器将执行原子读写,但对于大于int的变量,您可能需要使用Interlocked或lock来控制访问。
您不需要担心会话变量的线程同步;框架会为您处理它。
注意:以上只是一个示例,帮助您找到合适的API。它不一定演示最好的模式--通过静态方法Current访问HttpContext被认为是不好的形式,因为它使模拟上下文变得不可能。请查看this article,了解通过DI将其公开给您的代码的方法。
https://stackoverflow.com/questions/46482614
复制相似问题