为什么我的数据在回发后丢失了

时间:2011-04-03 17:46:03

标签: c# .net visual-studio-2008-sp1

我有一个简单的表格:

        <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1"
            runat="server" Text="Button" onclick="Button1_Click" />
    </div>
    </form>
</body>
</html>

代码背后:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        string myVariable;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                myVariable = "abc";
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {

        }
    }
}

在FormLoad中,myVariable被指定为“abc”。

在表单中,输入文本框并提交表单。 myVariable的值变为“null”

为什么myVariable上的数据丢失了? :(

我正在使用:VS2008 SP1 请帮忙!

5 个答案:

答案 0 :(得分:5)

  

每次页面都会创建一个新的网页类实例   发布到服务器。在传统的   网络编程,这通常是   意味着所有相关的信息   与页面和控件上   每轮都会丢失页面   行程。例如,如果用户输入   信息到文本框中,即   信息将在一轮中丢失   从浏览器或客户端设备旅行   到服务器。

引自ASP .NET State Management。我完全建议您浏览ASP .NET的状态管理功能。

此外,所有状态管理功能并不意味着存储所有内容。 This is another article,它会建议使用哪种状态管理功能来处理何种情况。

答案 1 :(得分:1)

当你宣布: string myVariable;

您在Page类的范围内声明它。但是,请考虑这里的过程。

1)在Page类的开头声明它没有值。 2)您检查Page_Load以查看它是否为Postback。如果不是,请给它一个值,abc。

现在,当您提交表单时,它是一个回发。因此,Page_Load中的赋值块不会运行!所以它保留为首次加载页面时的相同值...即NULL。

有意义吗?

尝试这样的事情:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                myVariable = "abc";
            }
else
{
// hey im a postback, i need a value though!
myVariable = "xyz";
}
        }

IMO我不认为国家管理是问题的本质,而不是变量范围。如果OP不了解范围,那么状态是一个推车/马问题。

答案 2 :(得分:1)

这就是它的方式(HTTP是无状态的)。你必须要做

    string myVariable;
    protected void Page_Load(object sender, EventArgs e)
    {
           myVariable = "abc";
    }

每次都在初始化变量。

或将其保存到Session集合。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Session["myVariable"] = "abc";
        }
    }

并使用Session["myVariable"] as String

答案 3 :(得分:1)

对象实例在页面加载中不是持久的。将每个对服务器的请求视为一个全新的页面类实例。为了跨多个页面请求保留数据,您需要将其存储在页面类的范围之外。您有很多选择:

  • 将其存储在会话状态
  • 将其存储在“应用程序状态”
  • 将其存储在数据库中
  • 将其存储在文件中

但它必须超出页面类的范围,因为每次页面请求都会重新实例化该类。

答案 4 :(得分:0)

存储几个字符的字符串变量的最佳位置是View State