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

Md.*_*mud 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;
    }
}
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.


Mar*_*ell 8

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

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


Kev*_*vin 5

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


Mat*_*zer 5

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)