【问题标题】:Store information across postback with static variable使用静态变量在回发中存储信息
【发布时间】:2016-03-09 16:41:24
【问题描述】:

我是 ASP.NET 和 C# 的新手。我有一个带有这样静态列表的网络表单:

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

由于服务器在将纯 HTML 发送回客户端后会销毁所有内容,那么为什么每当我将新书添加到 listBook(通过复选框)时,它会在回传中存储信息(在单个页面中)?首先我认为它是视图状态,但显然视图状态只存储 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 添加一个新类型,并在回发中保存信息。

【问题讨论】:

  • 该列表是 ViewModel 的一部分吗?你能发布更多你的代码吗?
  • 使用 Session 对象,正是为了这个,在调用之间存储信息。除非您知道自己在做什么,否则切勿使用静态字段,如果两个用户执行您的页面,则列表上的结果将混合,因为该字段是静态的。
  • @Gusman 哦,谢谢你,我会解决这个问题的 :) 但是你能告诉我更多关于静态的信息吗,我的意思是为什么它可以跨回发存储信息?

标签: c# asp.net static


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢,但是静态变量在回发@Servy 中存储信息的位置在哪里?这是我的主要问题。
  • @vuhiep.tran 在处理请求的服务器的内存中。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢你,猜猜是时候了解更多关于堆、堆栈和静态内存的知识了:)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2015-05-03
    • 2012-01-13
    相关资源
    最近更新 更多