使用静态变量在回发中存储信息

时间:2016-03-09 16:41:24

标签: c# asp.net static

我是ASP.NET和C#的新手。我有一个带有静态列表的Web表单,如下所示:

private static List<Book> listBook = new List<Book>();

由于服务器在发送回客户端纯HTML之后会销毁所有内容,因此,每当我向listBook添加新书(通过复选框)时,为什么它会在回发后(单页)中存储信息?首先我认为它是viewstate,但显然viewstate只存储ASP.NET控件信息。请帮助我,提前致谢!

public partial class TestSortBook : System.Web.UI.Page
{
    private static OBMDbContext context = new OBMDbContext();
    BookBL bookBL = new BookBL(context);
    GenreBL genreBL = new GenreBL(context);
    private static List<Genre> listGenre = new List<Genre>();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {

            List<Book> listBook = bookBL.FindAllBooks();
            PopulateGridView(listBook);
            //PopulateGridView(bookBL.SortBookByPriceAscend(listBook) );

            PopulateListView(genreBL.FindAllGenres());
        }
    }


    protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox cb = (CheckBox)sender;
        HiddenField hf = (HiddenField)cb.FindControl("HiddenField1");
        int genreID = Convert.ToInt16(hf.Value);
        listGenre.Add(genreBL.FindGenre(genreID));
        Response.Write("Nothing");
    }
}

让我解释一下上面的代码。列表视图中包含每个列表视图项中的复选框和隐藏字段。每当我点击一个复选框时,它会向我的listGenre添加一个新类型并在回发中保存信息。

3 个答案:

答案 0 :(得分:1)

  

由于服务器在发送回客户端纯HTML后会销毁所有内容

这根本不是真的。每个回发都会导致创建一个新的类实例来处理该请求的响应。由于您有静态字段,因此其数据将在请求之间保持不变。

也就是说,您不能依赖于使用此方法访问同一变量的每个请求;如果您有多个Web服务器处理响应,它们每个都有自己的静态变量。这使静态字段在某些情况下对缓存内容很有用,但不能作为规范的数据源(一般来说)。

答案 1 :(得分:0)

静态变量在回发后存储信息在哪里?

在内存中,与任何其他变量一样。

你必须明白,Asp.net上的每个页面都依赖于一个类,它不像php或其他脚本语言,你的站点是一个程序(从技术上讲它是一个加载在AppDomain中的程序集在IIS进程下:P),因为你有一个应用程序池,你可以在其上配置&#34; program&#34;将运行(基本上每个池都是一个独立的AppDomain),因此,虽然服务器没有清除这些应用程序池,但您的站点页面类将处于活动状态,因此任何静态变量都将保留在内存中。

答案 2 :(得分:0)

您是否考虑过使用浏览器本地存储来存储每个用户的内容。

取决于您存储的内容以及您打算如何使用它,这可能是最佳选择