21

我已经用“hi”声明了一个字符串变量测试。每次单击 Button1 时,我都希望该测试将附加其先前的值。但是我注意到,当单击按钮并重新加载页面时,它会丢失以前的值。那就是每次我点击它时,它的文字都是“hihi”。我希望下次单击时会出现“hihihihi”,依此类推。下面的代码有什么问题?

public partial class _Default : System.Web.UI.Page
{

    String test = "hi";

    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        test += test;
        Button1.Text = test;
    }
}
4

8 回答 8

32

不,这不是 asp.net 的工作方式。如果你需要这种行为,你应该这样做:

public string test {
  get {
    return (string) ViewState["test"] ?? "hi";
  }
  set {
    ViewState["test"] = value;
  }
}

当 ASP.NET 向服务器发送请求时,您的类的新版本将被实例化。如果您需要获取状态,则需要使用 ViewState(它保存在浏览器的隐藏字段中并随每个请求发送,因此每个页面保存状态),或者您可以使用 SessionState ,它是每个用户保存的状态. SessionState 默认保存在内存中。所以,如果你重新启动 IIS,这个状态就会消失。请注意,如果您重置 IIS,viewstate 的状态将不会消失(因为它是由浏览器发送的)。您也可以Cache再次使用其中,保存在内存中。这种状态适用于所有人您的应用程序的用户。有关重置 IIS 的相同规则适用。最后,您可以将变量设为静态。正如我所说,每次发出请求时,都会实例化一个新版本的类。当然,静态变量不是实例变量,因此静态变量的状态也会在回发中保存。关于 IIS 重置的相同规则适用于静态变量,如缓存和会话。

于 2012-05-31T17:36:15.417 回答
8

字段仅在单个请求期间存在。如果您希望它在请求之间存在,则必须使用会话状态、视图状态、cookie 或 HTML 表单/请求值之类的东西。

在大多数“真实”应用程序中,您甚至无法保证后续请求由同一台物理机器处理。

于 2012-05-31T17:36:20.923 回答
5

每次访问页面时,都会创建一个新的页面实例,并使用它自己的局部变量副本。有几种方法可以将值从一个页面视图保存到下一个页面视图,它们都在此处进行了描述:ASP.NET 状态管理概述

于 2012-05-31T17:37:28.160 回答
5
String test = "hi";

这是一个私有的实例类字段。

如果你想实现你的目标,你需要一个静态的。

顺便说一句,老实说,也许您正在寻找使用会话项目:

HttpContext.Current.Session["test"] = "hi";

这样做你会在你的事件处理程序中有这样的代码:

string currentTestText = (string)HttpContext.Current.Session["test"];

currentTestText += currentTestText;
Button1.Text = currentTestText;

HttpContext.Current.Session["test"] = currentTestText;
于 2012-05-31T17:37:53.273 回答
4

那是因为按钮会生成 POST BACK,您可以将变量声明为静态属性或创建 Session["Test"] 或在按钮上添加一些代码,如果 IsPostback {}

于 2012-05-31T17:36:08.267 回答
4

您的代码的问题是,在每次请求时Page都会重新创建您的实例,因此test不会保留以前的值,因为它属于一个新Page实例。

这是流程:

请求 1 开始

Page is created -> test = "hi"

请求 1 结束

Page is detroyed

请求 2 开始

Page is created -> test = "hi"

请求 2 结束

Page is detroyed
于 2012-05-31T17:38:08.120 回答
3

请记住,在回发时,asp.net 会重新创建对象并重新分配值。在您的情况下,测试变量被重新创建并被分配了“hi”的值。您可能希望将变量存储在会话中,然后附加该值。

于 2012-05-31T17:36:39.190 回答
2

这个有效,试试看

// in the page load event
if(!this.IsPostBack)
   Button1.Text = test;

// in the Click event
this.Button1.Text += test;

您当前代码的问题是您正在为按钮文本分配一个实例变量,因为它是一个实例变量,每次您请求具有相同值的页面时都会对其进行初始化,这就是为什么您总是只得到hihi而不是hihihihihihihi

每次单击按钮时,ASP.Net 都会创建一个new Page(),因此该test成员将始终被初始化为:test = "hi";

于 2012-05-31T17:34:55.383 回答