我一直在ASP.NET工作 - 刚刚开始,我有一个非常简单的问题。我有一个按钮,当你点击它时,它会在下拉框中添加一些简单的文字。这是代码:
public partial class _Default : System.Web.UI.Page
{
private int buttonclickedtimes = 1;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
this.DropDownList1.Items.Add(new System.Web.UI.WebControls.ListItem("Clickin' mah buttonz " + buttonclickedtimes + " times!"));
buttonclickedtimes++;
}
}
但buttonclickedtimes
始终是一体的。如果我将变量设为静态,则按预期工作。但是DropDownList
是一个成员变量,它显然是有状态的 - 就像我期望的那样工作。我不明白这种行为 - 所有成员变量是保存还是不保存在请求之间?我在VS2010中以调试模式运行。
答案 0 :(得分:3)
不,成员变量不会在请求之间保存,如果要保存,则需要将其放在Viewstate中。
Control的状态保存在Viewstate中(如果您启用了viewstate),这就是它在请求之间保存的原因。
要在Viewstate中保存,请将以下内容添加到Pre_Render
方法:
ViewState.Add("buttonClickTracker", buttonclickedtimes);
然后访问它:
buttonclickedTimes = Viewstate["buttonClickTracker"];
答案 1 :(得分:1)
我假设你使用的是asp.net webforms。 每次你回帖到服务器时,它基本上都是一个新的请求,页面将被加载并再次初始化。
因此,如果要在多个请求之间保留数据,则必须使用sesison变量等机制来存储它。
例如。 Session["ButtonClickedTimes"] +=1;
会在每次请求后递增它。
答案 2 :(得分:0)
在ASP.NET the Page is instantiated every time it is posted中。
因此,您的本地变量为1
,因为每次单击按钮时_Default
类都是新类。
如果要保存状态,可以使用ViewState对象或Session对象。
我建议你在MSDN上阅读一些Dino Esposito's ASP.NET overviews,他擅长解释所有这些。
答案 3 :(得分:0)
这归结为页面生命周期“问题”。会发生什么是页面被构造(并且你的buttonclickedtimes被设置为初始值1)。然后它会经历页面生命周期(init,load,event handeling,rendering等),并释放变量的内存分配。但是,当变量是静态的时,服务器知道挂起变量的内存分配,并且对它的任何更改都会持续存在。但是,该页面会保留该静态变量。这意味着对于单击按钮的x用户,该变量将递增x次。
如果您希望变量为单个用户实例保留,则可以使用ViewState或可能的Session状态来保存信息。
希望这有用。
答案 4 :(得分:0)
由于Web应用程序是无状态的...它每次重新加载页面时都会启动变量。这就是为什么我们有Page.IsPostback检查。
对于州,您应该使用viewstate或session state ....
静态类有一个intance,因此它们保留值而不管页面加载...
我希望这会对你有所帮助。