使用ASP.NET缓存/ViewState/Session

使用ASP.NET缓存/ViewState/Session,asp.net,session,caching,viewstate,Asp.net,Session,Caching,Viewstate,我试图了解缓存、页面视图状态和会话。我在VS2010中创建了一个ASP.NET web应用程序,并在页面中添加了3个文本框和一个按钮。我在调试模式下运行,在每个模式中输入随机文本,按下按钮,似乎什么都没有保存(所有文本都是“null”,如代码中所示)。我是否在错误的地方执行这些操作?我需要在web.config中添加一些内容吗?以下是我正在使用的代码: protected void Page_Load(object sender, EventArgs e) { i

我试图了解缓存、页面视图状态和会话。我在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" %>


谢谢,很抱歉问你这个菜鸟问题。我对此很陌生。

页面加载
发生在
按钮1\u单击
之前。因此,在
Page\u Load
上,您总是用国务袋中的内容替换文本框文本(
“null”
,然后是
“(缓存)”+“null”
等)。在文本框中输入的内容只有在单击按钮1之后才会生效


请改用Page_PreRender。

现在,每次单击按钮时,页面加载过程中的代码都会覆盖文本框。按钮1_click事件之前的文本值将有机会保存它们

如果将
If(IsPostBack)
更改为
If(!IsPostBack)
,则仅当您最初请求页面时,才会尝试从会话/viewstate/cache加载值。因此,您必须请求页面,使用按钮设置新值,然后重新请求(在地址栏中输入key)以运行页面加载中的代码


我建议您创建一个名为“Load Values”的新按钮,其单击事件将运行当前在页面中找到的代码。这样,您就不必将代码与请求是否为回发联系起来。我认为这会使您的测试结果更容易理解。

您介意发布Default.aspx代码的其余部分吗?似乎我对页面生命周期的了解严重不足。将代码移动到OnPreRender完成了我试图做的事情。谢谢洛基和穆罕默德!