我正在尝试了解Cache,Page ViewState和Session。我在VS2010中创建了一个ASP.NET Web应用程序,并在页面中添加了3个文本框和一个按钮。我在调试模式下运行,在每个文本中输入随机文本,按下按钮,似乎没有保存任何内容(所有文本都是“null”,正如您将在代码中看到的那样)。我在错误的地方执行这些操作吗?我需要在web.config中添加一些东西吗?这是我正在使用的代码:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
if (Cache["textbox1"] != null)
TextBox1.Text = (string)Cache["textbox1"];
else
TextBox1.Text = "null";
if (ViewState["textbox2"] != null)
TextBox2.Text = (string)ViewState["textbox2"];
else
TextBox2.Text = "null";
if (Session["textbox3"] != null)
TextBox3.Text = (string)Session["textbox3"];
else
TextBox3.Text = "null";
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Cache["textbox1"] = "(Cache) " + TextBox1.Text;
ViewState["textbox2"] = "(VS) " + TextBox2.Text;
Session["textbox3"] = "(Session) " + TextBox3.Text;
}
页面标题:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="State._Default" EnableSessionState="True" EnableViewState="True" %>
谢谢,抱歉新手问题。我对此很陌生。
答案 0 :(得分:1)
Page_Load
发生在Button1_Click
之前。因此,在Page_Load
上,您总是将文本框文本替换为statebags("null"
,然后"(Cache)" + "null"
等)。您在文本框中输入的内容永远不会存在,直到Button1_Click
。
改为使用Page_PreRender。
答案 1 :(得分:1)
现在,每次单击按钮时,Page_Load过程中的代码都会覆盖TextBox.Text值,然后Button1_Click事件才有机会保存它们。
如果将if (IsPostBack)
更改为if (!IsPostBack)
,则只会在您最初请求页面时尝试从会话/视图状态/缓存加载这些值。因此,您必须请求页面,使用按钮设置新值,然后重新请求(在地址栏中输入键)以在Page_Load中运行代码。
我建议你创建一个名为“加载值”的新按钮,其Click事件将运行当前在Page_Load中找到的代码。这样您就不必将该代码与请求是否为回发相关联。我认为这会让您的测试结果更容易理解。