asp页面变量不会持续存在吗?

时间:2013-08-23 18:11:17

标签: c# asp.net postback field persist

我有以下测试ASP页面:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
    </div>
    </form>
</body>
</html>

后面带有以下代码:

public partial class test : System.Web.UI.Page
{

    int x = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = x.ToString();
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        x++;
        Label1.Text = x.ToString();
    }
}

从非网络编程思维模式来看,我认为int x可能是测试页面类的一种对象字段,当我x++ x的值时会坚持通过回发,但似乎并非如此。那么这些领域究竟如何在持久性方面发挥作用呢?我发现它也很奇怪,因为当您点击按钮时,Label1.Text在您第一次点击它时会更改为1,但在此之后您无法超过1。

然后,一旦我理解为什么会发生这种情况,最简单的方法是什么才能实现我原本想要的? (x的值在回发中持续存在)

这就是现在使用viewstate看起来像我正在寻找的东西:

public partial class test:System.Web.UI.Page {

//static int x = 0;



protected void Page_Load(object sender, EventArgs e)
{

    if (ViewState["x"] == null)
    {
        ViewState["x"] = 0;
        Label1.Text = ViewState["x"].ToString();
    }


    //Label1.Text = x.ToString();
}

protected void Button1_Click(object sender, EventArgs e)
{

    ViewState["x"] = Convert.ToInt32(ViewState["x"].ToString()) + 1;
    Label1.Text = ViewState["x"].ToString();
    //x++;
    //Label1.Text = x.ToString();
}

}

4 个答案:

答案 0 :(得分:5)

x将不会被保留。每次请求时,x将初始化为0.

例如,使用会话状态来存储x的值,例如Session["x"] = x;

对于标签文本,ASP.NET会将其存储在ViewState内,它会在每个请求中保留控制值。如果要存储仅在一个页面上使用的值,可以自己使用ViewState。如果您希望在网站的其他页面上提供值,请使用会话。

ViewState["x"] = x;

答案 1 :(得分:1)

如果您希望变量x在每个帖子之间保持不变,则将其存储在会话或cookie中,然后在每个帖子上将其检索回来。 请不要使用 static作为Samiey Mehdi发布的内容,因为这将使所有针对应用程序域的Web会话都相同。

您可以将其存储在会话中:

protected void Page_Load(object sender, EventArgs e)
    {
        if(!Page.IsPostBack)
            Session["X"] = x;
        int valueFromSession = Convert.ToInt32(Session["X"]);
        Label1.Text = valueFromSession.ToString();
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
       int valueFromSession = Convert.ToInt32(Session["X"]);
         valueFromSession++;
       Session["X"] = valueFromSession;
        Label1.Text = valueFromSession.ToString();
    }

答案 2 :(得分:0)

像PHP一样,ASP可以使用会话变量和cookie来存储持久数据。但是,如果您只使用脚本变量,则每次运行脚本时都会重新初始化它们。

你也可以使用静态变量,它们表现更好,但我认为存在安全风险。

答案 3 :(得分:0)

正如Jason Evans正确地指出的那样......你必须将值存储在Session中才能坚持下去。您可以执行以下操作:

  protected void Page_Load(object sender, EventArgs e)
  {
        //Label1.Text = x.ToString();
        Session["x"] = x;
  }

  protected void Button1_Click(object sender, EventArgs e)
  {
        x = Session["x"];
        x++;
        Label1.Text = x.ToString();
  }

当然,还有其他方法可以持久化Cookie,ViewState,添加Querystring等值。但其中,SessionState是最常用的。