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

我用“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; } } 

不,这不是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。

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

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

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

 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; 

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

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

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

这是流程:

请求1开始

 Page is created -> test = "hi" 

请求1结束

 Page is detroyed 

请求2开始

 Page is created -> test = "hi" 

请求2结束

 Page is detroyed 

这是有效的,只需尝试一下

 // 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";