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

C# 在类中初始化的变量在页面加载时丢失其以前的值,c#,asp.net,C#,Asp.net,我已经用“hi”声明了一个字符串变量测试。每次单击按钮1时,我都希望该测试将附加其先前的值。但我注意到,当点击按钮并重新加载页面时,它会丢失以前的值。也就是说,每次我点击它时,它的文本都是“hihi”。我希望下一次点击时“hihihi”等等。下面的代码有什么问题 public partial class _Default : System.Web.UI.Page { String test = "hi"; protected void Page_Load(object sen

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

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;
    }
}

这很管用,试试看

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

// in the Click event
this.Button1.Text += test;
当前代码的问题是,您正在为按钮文本分配一个实例变量,因为它是一个实例变量,所以每次您请求具有相同值的页面时,它都会被初始化,这就是为什么您总是只得到hihihi,而不是hihihihi


每次单击该按钮时,ASP.Net都会创建一个
新页面()
,因此
test
成员将始终像这样初始化:
test=“hi”

这是因为按钮会生成回发。您可以将变量声明为静态属性,或者创建会话[“Test”],或者在按钮上添加一些代码,如果是回发{}

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

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

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

字段仅在单个请求期间存在。如果您想让它在两个请求之间运行,您必须使用会话状态、视图状态、cookie或HTML表单/请求值


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

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

每次访问页面时,都会创建一个新的页面实例,其中包含您自己的局部变量副本。有几种方法可以将值从一个页面视图持久化到下一个页面视图,下面对它们进行了描述:

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

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

顺便说一句,老实说,也许你想使用一个会话项:

HttpContext.Current.Session["test"] = "hi";
这样,您的事件处理程序中将有如下代码:

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

currentTestText += currentTestText;
Button1.Text = currentTestText;

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

代码的问题在于,每次请求时都会重新创建
页面
实例,因此
测试
不会保留以前的值,因为它属于新的
页面
实例

这就是流程:

请求1开始

Page is created -> test = "hi"
请求1结束

Page is detroyed
请求2开始

Page is created -> test = "hi"
请求2结束

Page is detroyed

默认情况下,字段是私有的,即使未声明为私有。。下面有很多很好的答案。。请记住,在C#windows应用程序中,变量(例如全局变量)不存在于AspNet中,这就是它们所拥有的东西,例如ViewState、会话、Cookie等。我已经尝试并测试过它,但它可能重复,但有什么问题:test+=test;按钮1.文本=测试;谢谢我明白了,这和控制不同吗?由于它们的值在请求之间是持久的?@Md.ArafatAlMahmud yes,控件使用视图状态来存储它们的键属性。我不使用webforms的原因之一!(我更喜欢MVC,它让你更接近金属,但这是个人的选择)所以这不同于在页面请求之间保持其值的控件?基本上,因为页面也是控件,所以我们谈论的是同一件事:)
Page is detroyed