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

前端之家收集整理的这篇文章主要介绍了ASP.NET C#静态变量是全局的?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
今天我发布了一个小型的asp.net beta web应用程序,允许内部人员修改一些产品信息。我们开始遇到用户覆盖彼此产品信息的问题,即使每个工作人员正在编辑完全不同的行(产品)。

在谷歌搜索后,我想我知道发生了什么,它与使用静态变量有关,下面是一个很简单的例子:

// 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["_groupID"] = Convert.ToInt16(Request.QueryString["GroupID"]);

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

short groupID = Convert.ToInt16(Session["_groupID"]);
原文链接:https://www.f2er.com/aspnet/253385.html

猜你在找的asp.Net相关文章