我有一个简单的表格:
<%@ 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 请帮忙!
答案 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。