我是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
添加一个新类型并在回发中保存信息。
答案 0 :(得分:1)
由于服务器在发送回客户端纯HTML后会销毁所有内容
这根本不是真的。每个回发都会导致创建一个新的类实例来处理该请求的响应。由于您有静态字段,因此其数据将在请求之间保持不变。
也就是说,您不能依赖于使用此方法访问同一变量的每个请求;如果您有多个Web服务器处理响应,它们每个都有自己的静态变量。这使静态字段在某些情况下对缓存内容很有用,但不能作为规范的数据源(一般来说)。
答案 1 :(得分:0)
静态变量在回发后存储信息在哪里?
在内存中,与任何其他变量一样。
你必须明白,Asp.net上的每个页面都依赖于一个类,它不像php或其他脚本语言,你的站点是一个程序(从技术上讲它是一个加载在AppDomain中的程序集在IIS进程下:P),因为你有一个应用程序池,你可以在其上配置&#34; program&#34;将运行(基本上每个池都是一个独立的AppDomain),因此,虽然服务器没有清除这些应用程序池,但您的站点页面类将处于活动状态,因此任何静态变量都将保留在内存中。
答案 2 :(得分:0)
您是否考虑过使用浏览器本地存储来存储每个用户的内容。
取决于您存储的内容以及您打算如何使用它,这可能是最佳选择