ASP.NET - 一些成员变量没有按预期工作?

时间:2011-03-08 13:22:55

标签: .net asp.net webforms page-lifecycle

我一直在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中以调试模式运行。

5 个答案:

答案 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,因此它们保留值而不管页面加载...

我希望这会对你有所帮助。