c# - ASP.NET C# 静态变量是全局的?

标签 c# asp.net static variables

今天我发布了一个小的 asp.net beta web 应用程序,允许内部人员修改一些产品信息。我们开始遇到用户互相覆盖产品信息的问题......即使每个员工都在编辑完全不同的行(产品)。

在 google 上搜索之后,我想我知道发生了什么,它与静态变量的使用有关,下面是该问题的一个快速粗略示例:

// EditProductGroup.aspx.cs
public partial class EditProductGroup : System.Web.UI.Page
{

    private static int _groupId = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
      _groupId = Convert.ToInt16(Request.QueryString["GroupID"]);

     // get existing ProductGroup information from database using 
     //_groupId to find the row and populate textboxes
    }

    private void saveProductGroupData()
    {
      // when user hits 'save changes' button, update row 
      //where the primary key column 'ProductGroupID' matches _groupId in the table
    }
}

因此,根据我的研究,整个应用程序实际上存在一个静态变量,这意味着如果多个用户正在使用该应用程序,他们将有效地读取“_groupId”的相同“值”,并且在某些情况下实际上将其设置为不同值的情况会导致页面的另一个用户“实例”将数据保存到错误的行 (ProductGroupId)。

我的意图是静态变量与其他用户隔离,不应干扰 - 每个用户都有自己的页面实例,因此他们有自己的“_groupId”变量实例。

幸运的是,这一切都发生在开发/暂存数据库上,而不是实时数据库。我不确定我是否只需要删除“static”关键字来阻止每个人设置/读取变量。

有什么想法吗?谢谢

最佳答案

是的,在 ASP.NET 中,静态字段的生命周期适用于应用程序域(请注意,这对于泛型类型略有不同)。

我建议使用服务器 session 来存储要与客户端浏览器 session (用户登录)实例关联的数据。 即

Session["_groupID"] = Convert.ToInt16(Request.QueryString["GroupID"]);

您可以通过以下方式检索它:

short groupID = Convert.ToInt16(Session["_groupID"]);

关于c# - ASP.NET C# 静态变量是全局的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1563171/

相关文章:

c# - 将任何带有变音符号的传入 URL 重定向为等效的没有变音符号的 URL

C++ 从 .CPP 文件访问变量

asp.net - 如何在不丢失用户保存的密码的情况下更改我的登录页面?

java - 从 JSP 调用后端 Java 类

c# - INotifyPropertyChanged 和静态属性

ios - 想要在静态 TableViewCells 的 Touch up 内部触发 IBAction

c# - DateTime[] 和 Object[] 问题

c# - 提交表单时模型集合丢失

javascript - 在 href 标签中加载外部网站的链接

c# - 我可以为长继承链中的子类调用最顶层的构造函数吗?