我有以下测试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();
}
}
答案 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)
你也可以使用静态变量,它们表现更好,但我认为存在安全风险。
答案 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是最常用的。