我用"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;
}
}
Run Code Online (Sandbox Code Playgroud)
aqu*_*nas 31
不,这不是asp.net的工作方式.如果您需要这种行为,您应该这样做:
public string test {
get {
return (string) ViewState["test"] ?? "hi";
}
set {
ViewState["test"] = value;
}
}
Run Code Online (Sandbox Code Playgroud)
当ASP.NET向服务器发送请求时,将实例化您的类的新版本.如果需要获取状态,则需要使用ViewState(它保存在浏览器的隐藏字段中并随每个请求一起发送,因此每页保存状态),或者您可以使用SessionState,这是每个用户保存的状态.默认情况下,SessionState保存在内存中.因此,如果重新启动IIS,此状态将消失.请注意,如果重置IIS(因为它是由浏览器发送),viewstate的状态不会消失.您也可以Cache再次使用它,保存在内存中.此状态适用于您的应用程序的所有用户.适用于重置IIS的相同规则.最后,您可以将变量设为静态.正如我所说,每次发出请求时,都会实例化一个新版本的类.当然,静态变量不是实例变量,因此静态变量的状态也会在回发中保存.有关IIS重置的相同规则适用于静态变量,如Cache和Session.
字段仅在单个请求的持续时间内存在.如果您希望它在请求之间生存,则必须使用会话状态,视图状态,cookie或HTML表单/请求值之类的内容.
在大多数"真实"应用程序中,您甚至无法保证后续请求由同一物理机器处理.
String test = "hi";
Run Code Online (Sandbox Code Playgroud)
这是一个私有的实例类字段.
如果你想实现目标,你需要一个静态的.
顺便说一句,老实说,也许你正在寻找使用会话项目:
HttpContext.Current.Session["test"] = "hi";
Run Code Online (Sandbox Code Playgroud)
这样你就可以在事件处理程序中得到这样的代码:
string currentTestText = (string)HttpContext.Current.Session["test"];
currentTestText += currentTestText;
Button1.Text = currentTestText;
HttpContext.Current.Session["test"] = currentTestText;
Run Code Online (Sandbox Code Playgroud)