静态变量的问题

Ogn*_*jen 3 c# asp.net-mvc

我有静态变量的问题.我的控制器组织的一部分如下:

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)

当多个用户同时使用此视图时会出现问题.所有用户都使用相同的静态变量并更改其值.怎么解决这个?

Sun*_*oot 8

您的整个 ASP.NET MVC应用程序在一个应用程序中运行AppDomain,即为所有用户提供的所有请求,所有内容!

创建静态变量时,会声明单个实例并使其可用于整个AppDomain,每个用户的每个请求都将看到相同的值.

实例变量(简单地删除'静态'单词)特定于它所在的特定对象的实例.在这种情况下,对象是Controller的一个实例,因此作为实例变量的变量将是个体/特定的仅控制器对象.ASP.NET运行时将为其服务的每个请求创建一个Controller实例,然后在处理完请求后丢弃该控制器对象.因此,如果删除静态字,变量将仅在该请求的持续时间内保持不变,然后消失.

正如其他海报所说,你需要的是会话状态.会话状态持续会话的持续时间,如浏览您网站的人,并且特定于每个用户.因此,如果将该变量存储在会话状态中,则每个用户的变量都不同.

问题是当用户离开你的网站时,会话状态消失,所以如果你需要更长时间停留,那么你应该使用像数据库这样的东西.


从您的评论和原始帖子中,它听起来(并且我会尝试尽可能礼貌地表达这一点),您还没有完全掌握一些面向对象的编程习语和概念.虽然会话状态本身不是OOP概念,但静态和实例变量之间的差异是.我建议了解这些,因为理解这些概念(OO编程的基础)意味着,恕我直言,你甚至不会问这个问题.我希望这个答案对你的理解有所帮助.


Aka*_*ava 7

您可以使用,

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)


Red*_*ter 6

使其成为私有实例变量,而不是静态变量.

如果您需要为每个用户维护此计数(但仅限于给定的会话),则可以执行以下操作:

if (Session["Count"] == null)
    Session["Count"] = 0;
Session["Count"] = (int)Session["Count"] + MyNewValue;
Run Code Online (Sandbox Code Playgroud)

如果您希望计数在会话中保持不变,那么您可以将其持久保存到数据库中.