在类中初始化的变量在页面加载时丢失其先前的值

时间:2012-05-31 17:32:19

标签: c# asp.net

我已经用“hi”声明了一个String变量测试。每次我点击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;
    }
}

8 个答案:

答案 0 :(得分:31)

不,这不是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重置的相同规则适用于静态变量,如Cache和Session。

答案 1 :(得分:8)

字段仅在单个请求的持续时间内存在。如果您希望它在请求之间生存,则必须使用会话状态,视图状态,cookie或HTML表单/请求值之类的内容。

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

答案 2 :(得分:5)

每次访问页面时,都会使用自己的本地变量副本创建页面的新实例。有几种方法可以将值从一个页面视图保存到下一个页面视图,这些都在这里描述:ASP.NET State Management Overview

答案 3 :(得分: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;

答案 4 :(得分:4)

多数民众赞成因为按钮生成POST BACK你可以将变量声明为静态属性或创建会话[“测试”]或在按钮点击时添加一些代码如果IsPostback {}

答案 5 :(得分:3)

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

答案 6 :(得分:3)

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

这是流程:

请求1开始

Page is created -> test = "hi"

请求1结束

Page is detroyed

请求2开始

Page is created -> test = "hi"

请求2结束

Page is detroyed

答案 7 :(得分: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";