【问题标题】:ASP.NET - some member variables not working as expected?ASP.NET - 一些成员变量没有按预期工作?
【发布时间】:2011-03-08 13:22:54
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    不,请求之间不保存成员变量,如果要保存,需要放到Viewstate中。

    控件的状态保存在 Viewstate 中(如果您启用了 viewstate),这就是它在请求之间保存的原因。

    要保存在 Viewstate 中,请将以下内容添加到 Pre_Render 方法中:

    ViewState.Add("buttonClickTracker", buttonclickedtimes);

    然后访问它:

    buttonclickedTimes = Viewstate["buttonClickTracker"];

    【讨论】:

    • 谢谢!很难选择答案,但我觉得这是最好的。
    【解决方案2】:

    我假设您使用的是 asp.net 网络表单。 在这里,每次您将帖子发回服务器时,基本上都是一个新请求,并且页面将被再次加载和初始化。

    因此,如果您想在多个请求之间保留数据,则必须使用诸如 sesison 变量之类的机制来存储它。

    例如。 Session["ButtonClickedTimes"] +=1; 会在每次请求后递增。

    【讨论】:

      【解决方案3】:

      这归结为页面生命周期“问题”。发生的情况是页面被构建(并且您的 buttonclickedtimes 设置为初始值 1)。然后它会经历页面生命周期(初始化、加载、事件处理、渲染等),并释放变量的内存分配。但是,当变量是静态的时,服务器知道要挂起变量的内存分配,并且对它的任何更改都会持续存在。但是,该静态变量会为该页面保留。这意味着对于单击您的按钮的 x 个用户,该变量将增加 x 次。

      如果您希望变量为单个用户实例保留,您可以使用 ViewState 或可能的 Session 状态来保存信息。

      希望这有帮助。

      【讨论】:

        【解决方案4】:

        由于 Web 应用程序是无状态的……它每次重新加载页面时都会启动变量。这就是我们有 Page.IsPostback 检查的原因。

        对于状态,您应该使用视图状态或会话状态 ....

        静态类只有一个实例,因此无论页面加载如何,它们都会保留该值...

        希望对你有帮助。

        【讨论】:

          【解决方案5】:

          在 ASP.NET 中 the Page is instantiated every time it is posted

          所以您的局部变量是1,因为每次单击按钮时_Default 类都是一个新类。

          如果要保存状态,可以使用ViewState对象或者Session对象。

          我建议你阅读 MSDN 上的一些 Dino Esposito's ASP.NET overviews,他擅长解释所有这些。

          【讨论】:

            猜你喜欢
            • 2022-01-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-11
            • 2020-09-04
            • 1970-01-01
            • 2010-09-11
            • 1970-01-01
            相关资源
            最近更新 更多