我有静态变量的问题.我的控制器组织的一部分如下:
namespace MyApp.Controllers
{
public class DevicesController : Controller
{
static int some_var = 0;
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SetValue(int temp){
some_var = temp;
return RedirectToAction("DisplayValue");
}
[Authorize]
public ActionResult DisplayValue(){
....
return View(some_object);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当多个用户同时使用此视图时会出现问题.所有用户都使用相同的静态变量并更改其值.怎么解决这个?
您的整个 ASP.NET MVC应用程序在一个应用程序中运行AppDomain,即为所有用户提供的所有请求,所有内容!
创建静态变量时,会声明单个实例并使其可用于整个AppDomain,每个用户的每个请求都将看到相同的值.
实例变量(简单地删除'静态'单词)特定于它所在的特定对象的实例.在这种情况下,对象是Controller的一个实例,因此作为实例变量的变量将是个体/特定的仅控制器对象.ASP.NET运行时将为其服务的每个请求创建一个Controller实例,然后在处理完请求后丢弃该控制器对象.因此,如果删除静态字,变量将仅在该请求的持续时间内保持不变,然后消失.
正如其他海报所说,你需要的是会话状态.会话状态持续会话的持续时间,如浏览您网站的人,并且特定于每个用户.因此,如果将该变量存储在会话状态中,则每个用户的变量都不同.
问题是当用户离开你的网站时,会话状态消失,所以如果你需要更长时间停留,那么你应该使用像数据库这样的东西.
从您的评论和原始帖子中,它听起来(并且我会尝试尽可能礼貌地表达这一点),您还没有完全掌握一些面向对象的编程习语和概念.虽然会话状态本身不是OOP概念,但静态和实例变量之间的差异是.我建议了解这些,因为理解这些概念(OO编程的基础)意味着,恕我直言,你甚至不会问这个问题.我希望这个答案对你的理解有所帮助.
您可以使用,
HttpContext.Current.Session["some_var"]
Run Code Online (Sandbox Code Playgroud)
而不是some_var,这将有所帮助.这将为记录的用户保留一个会话,您可以使用HttpContext.Current静态访问它
namespace MyApp.Controllers
{
public class DevicesController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SetValue(int temp){
HttpContext.Current.Session["some_var"] = temp;
return RedirectToAction("DisplayValue");
}
[Authorize]
public ActionResult DisplayValue(){
....
return View((int)HttpContext.Current.Session["some_var"]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
使其成为私有实例变量,而不是静态变量.
如果您需要为每个用户维护此计数(但仅限于给定的会话),则可以执行以下操作:
if (Session["Count"] == null)
Session["Count"] = 0;
Session["Count"] = (int)Session["Count"] + MyNewValue;
Run Code Online (Sandbox Code Playgroud)
如果您希望计数在会话中保持不变,那么您可以将其持久保存到数据库中.
| 归档时间: |
|
| 查看次数: |
7499 次 |
| 最近记录: |